snifer

[原创]嵌入式守护进程进阶

0
阅读(1778)

今天从这几个方面编写守护进程。

第一步:创建子进程,父进程退出

第二步:在子进程中创建新会话

第三步:改变当前目录为根目录

第四步:重设文件权限掩码

第五步:关闭文件描述符


创建子进程,父进程退出

这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第一步后就会在shell终端里造成一种程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在shell终端里则可以执行其他的命令,从而在形式上做到了与控制终端的脱离。

由于父进程已经先于子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样,原先的子进程就会变成init进程的子进程了。

实例:

pid = fork();

if (pid > 0)

{

exit(0); /*父进程退出*/

}

在子进程中创建新会话

setsid()函数作用:

setsid()函数用于创建一个新的会话,并担任该会话组的组长。调用setsid()有下面的3个作用。

让进程摆脱原会话的控制。

让进程摆脱原进程组的控制。

让进程摆脱原控制终端的控制。

setsid()函数格式:

blob.png

改变当前目录为根目录

通常的做法是让“/”作为守护进程的当前工作目录 。

使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行过程中,当前目录所在的文件系统是不能卸载的,这对以后的使用会造成诸多的麻烦(比如进入单用户模式)。

重设文件权限掩码

文件权限掩码是指屏蔽掉文件权限中的对应位。由于使用fork新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增加该守护进程的灵活性。设置文件权限掩码的函数是umask

通常的使用方法为umask(0)

关闭文件描述符

同文件权限掩码一样,用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下

在上面的第二步后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规的方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2的三个文件(常说的输入、输出和报错这三个文件)已经失去了存在的价值,也应被关闭。

实例:

for(i=0;i

{

close(i);

}

总的来书。Linux守护进程创建流程:blob.png

春天是播种希望的季节,希望大家天天都有播种的好心情。

Baidu
map