daemon进程是后台守护进程.linux 下server都是daemon进程。相信大部分开发人员都知道如何去写一个daemon进程。但是另一方面,大部分人不知道为什么要这么做,不少人是从某个地方copy一个函数。但是具体为什么这么实现,却不是很透彻。
daemon函数存在的原因是因为控制终端由于某些原因(如断开终端链接)会发送一些信号的原因。而接收进城处理这些信号缺省动作会让进程退出。这些信号会由于终端上敲一些特殊按键而产生。
贴一个daemon函数常见的实现:
int daemon(void)
{
pid_t pid = fork();
if( pid != 0 ) exit(0);//parent
//first children
if(setsid() == -1)
{
printf("setsid failed\n");
assert(0);
exit(-1);
}
umask(0);
pid = fork();
if( pid != 0) exit(0);
//second children
chdir ("/");
for (int i = 0; i < 3; i++)
{
close (i);
}
int stdfd = open ("/dev/null", O_RDWR);
dup2(stdfd, STDOUT_FILENO);
dup2(stdfd, STDERR_FILENO);
return 0;
}
1 、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。