我想了解如何将我的程序变成守护进程。一般来说,一个程序要想成为守护进程,需要执行以下步骤:
调用
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)的源代码链接,以便我可以更深入地理解这个过程吗?