如何制作守护进程

新手上路,请多包涵

我试图了解如何使我的程序成为守护进程。所以我遇到的一些事情一般来说,一个程序执行以下步骤成为一个守护进程:

  1. 致电 fork()

  2. 在父级中,调用 exit() 。这确保了原始父进程(守护进程的祖父进程)对其子进程终止、守护进程的父进程不再运行以及守护进程不是进程组领导感到满意。最后一点是成功完成下一步的必要条件。

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

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

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

  6. 打开文件描述符 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 许可协议

阅读 416
1 个回答

如果您正在寻找一种干净的方法,请考虑使用标准 int daemon(int nochdir, int noclose); 。手册页非常简单且不言自明。 手册页。一个经过良好测试的 api 在可移植性和稳定性方面远远超过我们自己的实现。

原文由 deadbeef 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题