资料介绍
分享到:标签:进程控制 Linux 守护进程 子进程
7.3 Linux守护进程
7.3.1 守护进程概述
守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有很多系统服务,大多数服务都是通过守护进程实现的,如本书在第二章中讲到的多种系统服务都是守护进程。同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。
由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才会退出。如果想让某个进程不因为用户、终端或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。可见,守护进程是非常重要的。
7.3.2 编写守护进程
编写守护进程看似复杂,但实际上也是遵循一个特定的流程。只要将此流程掌握了,就能很方便地编写出用户自己的守护进程。下面就分4个步骤来讲解怎样创建一个简单的守护进程。在讲解的同时,会配合介绍与创建守护进程相关的几个系统函数,希望读者能很好地掌握。
1.创建子进程,父进程退出
这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在shell终端里造成一种程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在shell终端里则可以执行其他的命令,从而在形式上做到了与控制终端的脱离。
到这里,有心的读者可能会问,父进程创建了子进程之后退出,此时该子进程不就没有父进程了吗?守护进程中确实会出现这么一个有趣的现象,由于父进程已经先于子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样,原先的子进程就会变成init进程的子进程了。其关键代码如下所示:
pid = fork();
if (pid 》 0)
{
exit(0); /*父进程退出*/
}
2.在子进程中创建新会话
这个步骤是创建守护进程中最重要的一步,虽然它的实现非常简单,但它的意义却非常重大。在这里使用的是系统函数setsid(),在具体介绍setsid()之前,读者首先要了解两个概念:进程组和会话期。
n 进程组。
进程组是一个或多个进程的集合。进程组由进程组ID来惟一标识。除了进程号(PID)之外,进程组ID也是一个进程的必备属性。
每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。且该进程ID不会因组长进程 的退出而受到影响。
n 会话期
会话组是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期,它们之间的关系如图7.6所示。
图7.6 进程组和会话期之间的关系图
接下来就可以具体介绍setsid()的相关内容。
(1)setsid()函数作用。
setsid()函数用于创建一个新的会话,并担任该会话组的组长。调用setsid()有下面的3个作用。
n 让进程摆脱原会话的控制。
n 让进程摆脱原进程组的控制。
n 让进程摆脱原控制终端的控制。
那么,在创建守护进程时为什么要调用setsid()函数呢?读者可以回忆一下创建守护进程的第一步,在那里调用了fork()函数来创建子进程再令父进程退出。由于在调用fork()函数时,子进程全盘复制了父进程的会话期、进程组和控制终端等,虽然父进程退出了,但原先的会话期、进程组和控制终端等并没有改变,因此,还不是真正意义上的独立,而setsid()函数能够使进程完全独立出来,从而脱离所有其他进程的控制。
7.3 Linux守护进程
7.3.1 守护进程概述
守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有很多系统服务,大多数服务都是通过守护进程实现的,如本书在第二章中讲到的多种系统服务都是守护进程。同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。
由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才会退出。如果想让某个进程不因为用户、终端或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。可见,守护进程是非常重要的。
7.3.2 编写守护进程
编写守护进程看似复杂,但实际上也是遵循一个特定的流程。只要将此流程掌握了,就能很方便地编写出用户自己的守护进程。下面就分4个步骤来讲解怎样创建一个简单的守护进程。在讲解的同时,会配合介绍与创建守护进程相关的几个系统函数,希望读者能很好地掌握。
1.创建子进程,父进程退出
这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在shell终端里造成一种程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在shell终端里则可以执行其他的命令,从而在形式上做到了与控制终端的脱离。
到这里,有心的读者可能会问,父进程创建了子进程之后退出,此时该子进程不就没有父进程了吗?守护进程中确实会出现这么一个有趣的现象,由于父进程已经先于子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样,原先的子进程就会变成init进程的子进程了。其关键代码如下所示:
pid = fork();
if (pid 》 0)
{
exit(0); /*父进程退出*/
}
2.在子进程中创建新会话
这个步骤是创建守护进程中最重要的一步,虽然它的实现非常简单,但它的意义却非常重大。在这里使用的是系统函数setsid(),在具体介绍setsid()之前,读者首先要了解两个概念:进程组和会话期。
n 进程组。
进程组是一个或多个进程的集合。进程组由进程组ID来惟一标识。除了进程号(PID)之外,进程组ID也是一个进程的必备属性。
每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。且该进程ID不会因组长进程 的退出而受到影响。
n 会话期
会话组是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期,它们之间的关系如图7.6所示。
图7.6 进程组和会话期之间的关系图
接下来就可以具体介绍setsid()的相关内容。
(1)setsid()函数作用。
setsid()函数用于创建一个新的会话,并担任该会话组的组长。调用setsid()有下面的3个作用。
n 让进程摆脱原会话的控制。
n 让进程摆脱原进程组的控制。
n 让进程摆脱原控制终端的控制。
那么,在创建守护进程时为什么要调用setsid()函数呢?读者可以回忆一下创建守护进程的第一步,在那里调用了fork()函数来创建子进程再令父进程退出。由于在调用fork()函数时,子进程全盘复制了父进程的会话期、进程组和控制终端等,虽然父进程退出了,但原先的会话期、进程组和控制终端等并没有改变,因此,还不是真正意义上的独立,而setsid()函数能够使进程完全独立出来,从而脱离所有其他进程的控制。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- Linux设备驱动开发详解 49次下载
- 电气信息工程丛书之Linux PowerPC详解-核心篇 0次下载
- Linux虚拟机之tcpdump命令操作详解 23次下载
- (网盘)ARM嵌入式Linux系统开发详解
- Linux系统中EXP命令详解质量汇总 1次下载
- 长文详解嵌入式Linux系统移植资料下载
- Linux内核GPIO操作函数的详解分析 28次下载
- Linux教程之进程的概念和进程管理命令的使用 2次下载
- 安全多方位 Linux系统守护进程解析 7次下载
- 详解如何监控和保护Linux下进程安全 0次下载
- linux下网卡配置详解 0次下载
- 守护进程的初级教程 0次下载
- Linux源码分析系列的进程 32次下载
- Linux 2.6进程调度
- Linux进程管理 0次下载
- Systemd是什么?Systemd Service配置文件详解 1048次阅读
- Linux进程地址空间详解 540次阅读
- Linux中进程、线程和协程的基础概念 650次阅读
- 如何在Linux终止僵尸进程 1952次阅读
- 如何在Linux使用ps/pstree/top命令查看进程 1666次阅读
- 文盘Rust--把程序作为守护进程启动 955次阅读
- Linux进程间通信方法之管道 1820次阅读
- Linux进程的内存消耗和泄漏详解 2597次阅读
- Linux:测试进程占用的虚拟内存大小 2762次阅读
- 虚拟机:linux 进程的最大线程个数 2624次阅读
- Linux进程调度时机概念分析 2682次阅读
- Linux进程管理:什么是进程?进程的生命周期 7750次阅读
- Linux进程的睡眠和唤醒 4276次阅读
- 基于Linux进程管理的详细剖析 3630次阅读
- Linux的系统选择、体系结构及应用详解 4184次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多