一个进程变为daemon进程后,能获得一个与父进程无瓜葛的环境(工作目录、文件描述符、信号处理...)。
所以daemon的功能我们可以自己简单实现(linux系统也提供了一个daemon函数):
signal(SIGALRM, SIG_IGN);
signal(SIGINT, SIG_IGN);
...
if (fork()) {
exit(0);
}
setsid创建新会话
关闭不需要的文件句柄
修改工作目录和文件掩码
chdir("/");
umask(0);
========== 下面是网上搜到的
a. fork()之后父进程退出。子进程确保不是process group leader,这是成功调用
setsid()所要求的。
b. setsid(),创建新的session和process group,成为其leader,并脱离控制终端。
c. 再次fork()之后父进程退出,子进程确保不是session leader,将永远不会重获
控制终端。这是SVR4的特性所致。
d. chdir( "/" ),减少管理员卸载(unmount)文件系统时可能遇上的麻烦。这一步可
选,也可chdir()到其它目录。
e. umask( 0 ),使当前进程对自己所写文件拥有完全控制权,避免继承的umask()设
置带来困挠。这一步可选。
f. 关闭0、1、2三个句柄。许多daemon程序用sysconf()获取_SC_OPEN_MAX,并在一
个偱环中关闭所有可能打开的文件句柄。目的在于释放不必要的系统资源,它们
是有限资源。
g. 出于安全以及健壮性考虑,即使当前进程不使用stdin、stdout、stderr,也应重
新打开0、1、2三个句柄,使之对应/dev/null。当然,你也可以根据需要使之对
应不同的(伪)文件。总之,保持0、1、2三个句柄呈打开状态,并使之指向无害文
件。