你能解释这个C代码吗? (创build一个deamon程序)

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

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

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

第一行:创buildsubprocess并终止父进程,所以父父进程将返回到shell,subprocess将继续在后台执行程序。

第二行:当subprocess(谁在执行程序)被终止时,忽略应该发送给父进程(谁在控制terminal)的信号。 我觉得这一行会避免僵尸小孩的发生?

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

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

第五行:不知道它做了什么。


你能帮我理解这个代码吗? 提前致谢 :)

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

你在问什么setpgrp

这是相关的手册页

你可以输入man setpgrp来获得它。

另请阅读linux守护进程的howto

你也可以使用守护进程功能

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

  1. 叉,并有父母出口。
  2. 确保你不是过程组的领导者。 不需要在这里调用setpgrp,因为我们刚刚分叉,我们是进程组的成员而不是领导者。
  3. 创建一个新的会话(setsid),这保证了我们没有控制终端。
  4. 我们继承了父母的所有描述符,关闭那些你不需要的描述符。
  5. 更改工作目录。 因此,您可能不想卸载某些装入的卷。 其实chroot如果可以在这里的话。
  6. 将filemode创建掩码设置为零。

你的代码中的信号线只是设置它们忽略这些信号。 setpgrp是不需要的,它应该是setsid。 然后,你只是想念一些你需要做的其他事情。