我试图了解如何使我的程序成为守护进程。所以我遇到的一些事情一般来说,一个程序执行以下步骤成为一个守护进程:
致电
fork()
。在父级中,调用
exit()
。这确保了原始父进程(守护进程的祖父进程)对其子进程终止、守护进程的父进程不再运行以及守护进程不是进程组领导感到满意。最后一点是成功完成下一步的必要条件。调用
setsid()
,给守护进程一个新的进程组和会话,两者都将它作为领导者。这也确保了该进程没有关联的控制终端(因为该进程刚刚创建了一个新会话,并且不会分配一个)。通过
chdir()
将工作目录更改为根目录。这样做是因为继承的工作目录可以位于文件系统上的任何位置。守护进程倾向于在系统正常运行期间运行,并且您不希望保持一些随机目录打开,从而阻止管理员卸载包含该目录的文件系统。关闭所有文件描述符。
打开文件描述符 0、1 和 2(标准输入、标准输出和标准错误)并将它们重定向到
/dev/null
。
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ( );
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid ( ) == -1)
return -1;
/* set the working directory to the root directory */
if (chdir ("/") == -1)
return -1;
/* close all open files--NR_OPEN is overkill, but works */
for (i = 0; i < NR_OPEN; i++)
close (i);
/* redirect fd's 0,1,2 to /dev/null */
open ("/dev/null", O_RDWR);
/* stdin */
dup (0);
/* stdout */
dup (0);
/* stderror */
/* do its daemon thing... */
return 0;
}
有人可以给我一个链接到一些程序(如 Apache)的现有源代码,以便我可以更深入地理解这个过程吗?
原文由 Registered User 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您正在寻找一种干净的方法,请考虑使用标准
int daemon(int nochdir, int noclose);
。手册页非常简单且不言自明。 手册页。一个经过良好测试的 api 在可移植性和稳定性方面远远超过我们自己的实现。