第一次听见这个词语,守护进程感觉很有安全,哈哈!下面我就这个名词来阐述一下我的理解:
守护进程也叫精灵进程,它是独立于控制终端并周期性指向某种任务或者等待处理某些事情发生的事件。 即Linux系统启动时启动的系统服务进程,它没有控制终端,不能直接和用户交互。它也不受用户登录注销的影响,一直运行着。
守护进程一般是以d为结尾的,表示Daemon。
在Linux中一般用ps axj | grep -E ‘d$’查看系统中所有的守护进程, 结果如下图: 那么怎么创建守护进程呢?库里面提供了setsid()函数,用它来创建一个Session,并成为会话的Leader; 函数原型如下:
#include<unistd.h> Pid_t setsid(void);其返回值类型时pit_t,则其返回值就是新创建的Session的id(即当前进程的id),出错返回-1; 此进程不可以时进程组的组长,否则返回-1;
那么怎么可以使当前进程不是进程组的组长呢? 先fork()一个子进程在调用setsid(); 由于fork()一个子进程后,子进程和父进程就在同一个进程组,进程组的组长就是该组第一个进程,怎么轮也轮不到子进程,这时子进程在调用setsid()就可以了;
调用成功的结果是: 1)当前进程自成一个会话(Session); 2)当前进程自成进程组; 3)当前进程与终端无关;
以下是创建守护进程的过程: 1. 调用umask()将文件模式创建屏蔽字设置为0;——-umask(0);
调用fork()创建子进程,然后父进程退出;(一般没有输入输出,一般是孤儿进程)调用setsid()创建一个新会话(Session);将当前目录更改为根目录;关闭文件操作符;忽略SINCHID信号;以下是我的代码实现:
以下是运行的结果:
大家可能奇怪为什么创建守护进程时fork两次?
防止进程再次打开一个终端,因为打开一个控制终端的前提条件是该进程必须是会话组长,而守护进程不可以是会话组长,故再fork一次,子进程id!=ppid,所以也无法打开一个新的控制终端。