守护进程的编程规则

来源:互联网 发布:计算机技术与软件 职称 编辑:程序博客网 时间:2024/05/19 17:02

要理解守护进程的编程规则必须先搞明白进程组、会话、组长进程等关系。

1.进程组

每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或者多个进程的集合。每个进程组都有一个组长进程。组长进程的标识是,其进程ID和进程组ID相等。

2.会话

会话是一个或者多个进程组的集合。

进程可以调用setsid(void)创建一个新会话,如果调用此函数的进程不是一个进程组的组长,则此函数就会创建一个新会话,结果将发生下面三件事:

1)该进程编程新会话的首进程(会话首进程是创建该会话的进程),此时,该进程是新会话中的唯一进程。

2)该进程成为一个新进程组的组长进程,新进程组的ID是该调用进程的进程ID

3)该进程没有控制终端。如果在调用setsid之前有控制终端,这种联系也会中断。这刚好满足守护进程的规则,我们可以预想到,要编写守护进程需要调用setsid。


注意,如果该调用进程本身是进程组的组长,调用setsid返回错误。为了不保证发生这种情况,通常先fork,然后使其父进程终止,而子进程则继续。


3.守护进程的编程规则

(1)调用umask将文件模式创建屏蔽字设置为0

(2)调用fork,父进程退出,然后调用setsid()

(3)将工作目录改为根目录。从父进程继承来的当前工作目录可能在一个装配文件系统中,因为守护进程通常在系统再引导之前是一直存在的,所以如果守护进程的当前工作目录在一个装配文件系统中,那么该文件系统不能被卸载,这与装配文件系统的原意不符。

(4)关闭需要的文件描述符。这使得守护进程不再持有从其父进程继承而来的文件描述符,可以使用open_max()或者getrlimit()来判定最高文件描述符的值,并关闭所有到該值的描述符

(5)重定向标准输入、输出、错误输出

0 0
原创粉丝点击