如何制作进程守护进程

时间:2011-03-21 21:48:48

标签: c linux daemon systems-programming

我想了解如何让我的程序成为守护进程。所以我遇到的一些事情通常,程序会执行以下步骤来成为守护进程:

  1. 致电fork( )
  2. 在家长中,请致电exit( )。这确保了原始父(守护进程) 祖父母)对孩子的终止感到满意,认为守护者的父母不是 运行时间更长,守护程序不是进程组负责人。最后一点 是成功完成下一步的要求。

  3. 调用setsid( ),为守护程序提供一个新的进程组和会话 有它作为领导者。这也确保了该过程没有关联 控制终端(因为进程刚刚创建了一个新会话,并且不会分配 一个)。

  4. 通过chdir( )将工作目录更改为根目录。这个完成了 因为继承的工作目录可以在文件系统上的任何位置。 守护进程倾向于在系统正常运行时间内运行,而您不需要 保持一些随机目录打开,从而阻止管理员 卸载包含该目录的文件系统。

  5. 关闭所有文件描述符。

  6. 打开文件描述符0,1和2(标准输入,标准输出和标准错误) 并将它们重定向到/dev/null
  7. #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,这样我就可以更深入地理解这个过程了。

2 个答案:

答案 0 :(得分:17)

如果您正在寻找干净的方法,请考虑使用标准的api int daemon(int nochdir, int noclose);。手册页非常简单,自我解释。 man page。经过充分测试的api远远超过了我们自己实现的便携性和稳定性。

答案 1 :(得分:2)

在Linux中,可以使用以下方法轻松完成:

int main(int argc, char* argv[])
{
    daemon(0,0);
    while(1)
    {
        sleep(10)
        /*do something*/
    }

    return 0;
}