daemon定义
运行在后台的程序,通常不需要与用户进行交互的。
任何父进程id是0的通常是kernel进程,作为系统启动的一部分,除了init是用户态的命令。
规则
第一件事情是调用umask设置文件模型的mask为0,文件mode creation mask可以被进程继承,但daemon进程需要创建文件时,需要特殊的权限。
调用fork,退出父进程exit,这可以做几件事情,首先,daemon将使用shell命令行启动,其次,子进程继承了process group id,但获取一个新的id,因此我们可以确保子进程不会是一个process group leader,为调用setsid做准备。
调用setsid创建一个新的session。该进程开始成为一个新的session的session leader,然后成为新的process group的process group leader,并且没有controlling terminal。
一些基于System V的用户推荐再fork一下,第二个child仍旧是一个daemon,然后保证该daemon不是一个session leader,在System V规则下阻止得到一个控制终端。
避免获取一个终端,使用O_NOCTTY来确保打开一个非终端设备。
修改当前目录为根目录(即/),为房子daemon存在于mounted file system中,系统重启时,文件系统不能够unmounted。
不需要的文件描述符应该关闭,阻止从parent中继承下来的文件描述符。
由于没有终端的缘故,因此需要将文件描述符0,1和2将切换到/dev/null。