你能解释一下这个C代码吗? (创建一个守护程序)

时间:2011-12-08 23:03:29

标签: c linux process signals file-descriptor

我想好好理解以下代码:

/* 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 */

以下是我对上述代码的理解:

第1行:创建子进程并终止父进程,因此父进程将返回到shell,子进程将继续在后台执行该程序。

第二行:当子进程(执行程序的用户)终止时,忽略应该发送到父进程(谁控制终端)的信号。我认为这条线会避免僵尸儿童的发生吗?

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

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

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


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

3 个答案:

答案 0 :(得分:6)

您在问setpgrp做了什么。

以下是相关的man page

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

另请阅读linux daemon howto

您也可以使用daemon功能

答案 1 :(得分:2)

1)fork()'和'在父级中返回,有两个含义:A)在后台运行。 B)以便携方式避免僵尸

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

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

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

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

答案 2 :(得分:1)

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

  1. 分叉并有父出口。
  2. 确保您不是流程组负责人。我们刚刚分叉,不应该在这里调用setpgrp,我们是流程组的成员,而不是领导者。
  3. 创建一个新会话(setsid),这保证我们没有控制终端。
  4. 我们继承了父母的所有描述符,关闭了你不需要的描述符。
  5. 更改工作目录。因此,您可能不想在某些已安装的卷上卸载。事实上,如果你可以在这里chroot。
  6. 将filemode创建掩码设置为零。
  7. 代码中的信号线只是将它们设置为忽略这些信号。不需要setpgrp,它应该是setsid。然后,你只是缺少一些你需要做的其他事情。