【发布时间】:2011-07-20 01:01:05
【问题描述】:
我正在尝试了解如何使我的程序成为守护程序。所以我遇到的一些事情一般来说,程序执行以下步骤成为守护程序:
- 致电
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)的现有源代码,以便我可以更深入地了解这个过程。
【问题讨论】:
-
您可以获取 Apache 源代码here。
-
也许daemon(3) 可能会有所帮助。它基本上表示所需的功能已经实现。
-
@nmichaels 感谢您的消息实际上我只寻找那些使其成为守护进程的行。Apache 不是专门的。所以如果有些在线将比下载整个源代码容易。
-
以上帖子几乎 100% 是从Linux System Programming, 2nd Edition - Talking Directly to the Kernel and C LibraryRobert Love 的书(第 173、174 页)中复制粘贴的。如果@RegisteredUser 提到这一点就好了。
标签: c linux daemon systems-programming