我想好好理解以下代码:
/* 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行:不知道它的作用。
你能帮我理解一下这段代码吗?在此先感谢:)
答案 0 :(得分:6)
答案 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。
答案 2 :(得分:1)
要创建守护程序,您需要:
代码中的信号线只是将它们设置为忽略这些信号。不需要setpgrp,它应该是setsid。然后,你只是缺少一些你需要做的其他事情。