一尘不染

Linux守护进程

linux

我正在编写Linux守护程序。我发现了两种方法。

  1. 通过调用fork()和设置守护进程sid
  2. 使用运行程序&

哪个是正确的方法?


阅读 229

收藏
2020-06-02

共1个答案

一尘不染

来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

以下是成为守护程序的步骤:

1.
fork(),以便父级可以退出,这会将控制权返回给命令行或shell来调用您的程序。需要执行此步骤,以确保新流程不会成为流程组负责人。如果您是流程组负责人,则下一步,setsid()将失败。
2.
setsid()成为进程组和会话组组长。由于控制终端与会话相关联,并且此新会话尚未获得控制终端,因此我们的进程现在没有控制终端,这对于守护程序而言是一件好事。
3. 再次fork(),以便父级(会话组负责人)可以退出。这意味着,作为非会议小组的负责人,我们永远无法重新获得控制终端。
4. chdir(“
/”),以确保我们的进程不使用任何目录。如果不这样做,可能会导致管理员无法卸载文件系统,因为它是我们的当前目录。[等效地,我们可以切换到包含对守护程序的操作很重要的文件的任何目录。
5. umask(0),这样我们就可以完全控制所写内容的权限。我们不知道我们可能继承了什么umask。[此步骤是可选的]
6. close()fds
0、1和2。这将释放我们从父进程继承的标准输入,输出和错误。我们无法知道这些fds可能被重定向到了哪里。请注意,许多守护程序使用sysconf()确定限制_SC_OPEN_MAX。_SC_OPEN_MAX告诉您最大打开文件数/进程数。然后,在一个循环中,守护程序可以关闭所有可能的文件描述符。您必须决定是否需要执行此操作。如果您认为可能打开了文件描述符,则应该关闭它们,因为并发文件描述符的数量受到限制。
7.
为stdin,stdout和stderr建立新的打开描述符。即使您不打算使用它们,将它们打开也是一个好主意。精确地处理这些只是一个问题。例如,如果您有一个日志文件,则可能希望以stdout或stderr的形式打开它,并以stdin的形式打开“
/ dev / null”;或者,您可以以stderr和/或stdout的身份打开“ / dev /
console”,以stdin或其他对您的特定守护程序有意义的组合形式打开“ / dev / null”。

更好的是,仅调用daemon()函数(如果可用)。

2020-06-02