http://www.114390.com/article/46410.htm php
linux 建立守护进程的相关知识,这篇文章主要介绍了linux 建立守护进程的相关知识,须要的朋友能够参考下 linux
关键字:linux、守护进程 shell
建立子进程,父进程退出
这是编写守护进程的第一步。因为守护进程是脱离控制终端的,所以,完成第一步后就会在Shell终端里形成一程序已经运行完毕的假象。以后的全部工做都在子进程中完成,而用户在Shell终端里则能够执行其余命令,从而在形式上作到了与控制终端的脱离。
在Linux中父进程先于子进程退出会形成子进程成为孤儿进程,而每当系统发现一个孤儿进程是,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。
在子进程中建立新会话
这个步骤是建立守护进程中最重要的一步,虽然它的实现很是简单,但它的意义却很是重大。在这里使用的是系统函数setsid,在具体介绍setsid以前,首先要了解两个概念:进程组和会话期
进程组:是一个或多个进程的集合。进程组有进程组ID来惟一标识。除了进程号(PID)以外,进程组ID也是一个进程的必备属性。每一个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。且该进程组ID不会因组长进程的退出而受到影响。
会话周期:会话期是一个或多个进程组的集合。一般,一个会话开始与用户登陆,终止于用户退出,在此期间该用户运行的全部进程都属于这个会话期。
接下来就能够具体介绍setsid的相关内容:
(1)setsid函数做用:
setsid函数用于建立一个新的会话,并担任该会话组的组长。调用setsid有下面的3个做用:
让进程摆脱原会话的控制
让进程摆脱原进程组的控制
让进程摆脱原控制终端的控制
那么,在建立守护进程时为何要调用setsid函数呢?因为建立守护进程的第一步调用了fork函数来建立子进程,再将父进程退出。因为在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并无改变,所以,还还不是真正意义上的独立开来,而setsid函数可以使进程彻底独立出来,从而摆脱其余进程的控制。
改变当前目录为根目录
这一步也是必要的步骤。使用fork建立的子进程继承了父进程的当前工做目录。因为在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对之后的使用会形成诸多的麻烦(好比系统因为某种缘由要进入单用户模式)。所以,一般的作法是让”/”做为守护进程的当前工做目录,这样就能够避免上述的问题,固然,若有特殊须要,也能够把当前工做目录换成其余的路径,如/tmp。改变工做目录的常见函数式chdir。
重设文件权限掩码
文件权限掩码是指屏蔽掉文件权限中的对应位。好比,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限。因为使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。所以,把文件权限掩码设置为0,能够大大加强该守护进程的灵活性。设置文件权限掩码的函数是umask。在这里,一般的使用方法为umask(0)。
关闭文件描述符
同文件权限码同样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们同样消耗系统资源,并且可能致使所在的文件系统没法卸下。函数