我想很好地理解下面的代码:
/* 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。
你在问什么setpgrp
。
这是相关的手册页
你可以输入man setpgrp
来获得它。
另请阅读linux守护进程的howto
你也可以使用守护进程功能
要创建一个守护进程,您需要:
你的代码中的信号线只是设置它们忽略这些信号。 setpgrp是不需要的,它应该是setsid。 然后,你只是想念一些你需要做的其他事情。