如何制作进程守护进程


68

我试图了解如何使我的程序成为守护程序,因此遇到的一些事情通常是程序执行以下步骤来成为守护程序:

  1. 致电fork( )
  2. 在家长中,致电exit( )。这样可确保原始父级(守护程序的祖父母)对它的子级终止,守护程序的父级不再运行以及该守护程序不是进程组负责人感到满意。最后一点是成功完成下一步的要求。

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

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

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

  6. 打开文件描述符0、1和2(标准输入,标准输出和标准错误),然后将它们重定向到/dev/null

有人可以给我链接到某些程序(例如Apache)的现有源代码,以便我可以更深入地了解这一过程。


2
您可以在此处获取Apache来源。
nmichaels 2011年

7
也许daemon(3)可能会有所帮助。它基本上说所需的功能已经实现。
弗拉德

@nmichaels感谢您的来信,实际上我只是在寻找使其成为守护进程的那些行。
注册用户


1
上述职位几乎是100%从书本复制粘贴的Linux系统编程(第二版) -直接对话的内核和C库罗伯特·拉姆(173页,174页)。如果@RegisteredUser提到它会很好。
patryk.beza

Answers:


19

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


我很高兴这是现在的答案,而不是隐藏在评论中。也许您可以将其充实一些–链接到标准(甚至更好的是,链接到教程或示例)。
RJHunter '16

2
@deadbeef该答案比以前存在普通链接的答案要好得多。但是,尽管它也非常接近链接(无论如何,我认为给定的链接要稳定得多)。我会尝试增强答案,给出一个简短的代码示例(尤其是由于链接的手册页中没有),或者引用摘要。
πάνταῥεῖ

2
请注意,守护程序功能符合POSIX。
patryk.beza

2
freedesktop.org/software/systemd/man/daemon.html#SysV%20Daemons上,写道:“daemon()不应使用BSD功能,因为它仅实现了这些[15]步骤的一部分。”
oli_arborum

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.