gpt4 book ai didi

c - 如何制作守护进程

转载 作者:IT老高 更新时间:2023-10-28 12:29:59 24 4
gpt4 key购买 nike

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

  1. 调用 fork().

  2. 在父级中,调用 exit()。这确保了原始父级(守护进程的祖 parent )对其子进程终止感到满意,并且守护进程的父进程没有运行时间更长,并且守护进程不是进程组负责人。最后一点是成功完成下一步的必要条件。

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

  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)的现有源代码,以便我更深入地了解这个过程?

最佳答案

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

关于c - 如何制作守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com