【问题标题】:Can you explain this C code? (Create a deamon program)你能解释一下这个C代码吗? (创建一个守护程序)
【发布时间】:2011-12-08 23:03:28
【问题描述】:

我想好好理解下面的代码:

/* Become deamon + unstoppable and no zombies children (= no wait()) */

if(fork() != 0)  return 0;        /* Parent returns OK to shell */
signal(SIGCLD, SIG_IGN);          /* ignore child death */
signal(SIGHUP, SIG_IGN);          /* ignore terminal hangups */
for(i = 0; i < 32; i++) close(i); /* close open files */
setpgrp();                        /* break away from process group */

我是这样理解上面的代码的:

第一行:创建子进程并终止父进程,这样父父进程将返回shell,子进程将继续在后台执行程序。

第 2 行: 当子进程(正在执行程序)终止时,忽略应该发送给父进程(正在控制终端)的信号。我觉得这条线会避免僵尸孩子的出现吗?

第 3 行:我读到它忽略了 POSIX 的挂断,我不确定它到底是什么。

第 4 行:关闭描述符文件为 0 到 31 的打开文件(我不知道为什么从 0 到 31)

第 5 行:不知道它的作用。


你能帮我理解这段代码吗?在此先感谢:)

【问题讨论】:

    标签: c linux process signals file-descriptor


    【解决方案1】:

    你在问setpgrp 做了什么。

    这里是相关的man page

    您可以输入man setpgrp 来获取它。

    另请阅读linux daemon howto

    你也可以使用daemon函数

    【讨论】:

      【解决方案2】:

      1) 在父进程中fork()'ing 和return,有两个含义: A) 在后台运行。 B) 以便携的方式避开僵尸

      2) http://en.wikipedia.org/wiki/SIGCHLD

      3) SIGHUP 通常在 tty 关闭时传递给进程。它或多或少意味着“继续运行,即使关联的 tty 消失了”。

      4) 关闭文件描述符允许从 ssh 会话之类的东西启动守护程序,而 ssh 会话不会在关闭时等待文件描述符 0-31 被关闭。如果您不这样做,守护程序有时可能会导致 ssh 会话似乎在退出时挂起。 0-31 没有什么神奇之处——有些进程关闭的文件描述符比这更多,但当然 0、1 和 2 有特殊含义:分别为 stdin、stdout、stderr。

      5)http://en.wikipedia.org/wiki/Process_group

      【讨论】:

        【解决方案3】:

        要创建守护进程,您需要:

        1. 分叉并让父级退出。
        2. 确保您不是流程组负责人。不需要在这里调用 setpgrp,因为我们刚刚分叉,而且我们是进程组的成员而不是领导者。
        3. 创建一个新会话 (setsid),这样可以保证我们没有控制终端。
        4. 我们从父级继承了所有描述符,关闭不需要的描述符。
        5. 更改工作目录。因此,它不在您可能要卸载的某些已安装卷上。事实上,如果可以的话,chroot 在这里。
        6. 将文件模式创建掩码设置为零。

        代码中的信号线只是将它们设置为忽略这些信号。不需要setpgrp,它应该是setsid。然后,您只是错过了一些您需要做的其他事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多