首页 文章

如何制作进程守护进程

提问于
浏览
66

我试图理解如何使我的程序成为守护进程 . 所以我遇到的一些事情通常,程序执行以下步骤来成为守护进程:

  • 致电 fork( ) .

  • 在父级中,调用 exit( ) . 这可确保原始父级(守护程序's grandparent) is satisfied that its child terminated, that the daemon'的父级不再运行,并且守护程序不是进程组组长 . 最后一点是成功完成下一步的要求 .

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

  • 通过 chdir( ) 将工作目录更改为根目录 . 这样做是因为继承的工作目录可以在文件系统的任何位置 . 守护进程倾向于在系统持续运行期间's uptime, and you don'想要保持一些随机目录打开,从而阻止管理员卸载包含该目录的文件系统 .

  • 关闭所有文件描述符 .

  • 打开文件描述符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,这样我就可以更深入地理解这个过程 .

2 回答

  • 16

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

  • 1

    在Linux中,它可以很容易地使用 .

    main()
    {
    
    daemon(0,0);
    while(1)
    {
    sleep(10)
    /*do something*/
    }
    
    }
    

相关问题