我想很好地理解下面的代码:
/* 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,子进程将继续在后台执行程序。
第二行:忽略子进程(执行程序的进程)终止时应该发送给父进程(控制终端的进程)的信号。我想这条线会避免僵尸孩子的发生吗?
第三行:我读到它忽略了POSIX的Hangup,我不确定它到底是什么。
第4行:关闭描述符文件为0到31的打开文件(我不确定为什么从0到31)
第5行:不知道它是做什么的
你能帮我理解这段代码吗?提前感谢:)
你问的是setpgrp
是做什么的
这是相关的手册页
你可以输入man setpgrp
来获取它。
同时读取linux守护进程howto
您也可以使用守护进程函数
1) fork()在父进程中执行和返回,有两层含义:A)在后台运行。B)以便携的方式避开僵尸
http://en.wikipedia.org/wiki/SIGCHLD2)
3) SIGHUP通常在tty关闭时传递给进程。它或多或少意味着"继续运行,即使相关的tty消失了"。
4)关闭文件描述符允许从类似ssh会话的东西启动守护进程,而不需要ssh会话在关闭时等待文件描述符0-31关闭。如果不这样做,守护进程有时可能会导致ssh会话在退出时似乎挂起。0-31没有什么神奇的——有些进程关闭的文件描述符比0多,但是0、1和2当然有特殊的含义:分别是stdin、stdout、stderr。
5) http://en.wikipedia.org/wiki/Process_group
要创建一个守护进程,您需要:
- Fork并让父进程退出
- 确保你不是工艺组组长。不需要在这里调用setpgrp,因为我们刚刚分叉,我们是进程组的成员,而不是leader。
- 创建一个新的会话(setsid),这保证我们没有控制终端。
- 我们从父类继承了所有的描述符,关闭不需要的描述符。
- 更改工作目录因此,您可能不想卸载某些已挂载的卷。
- 设置文件模式创建掩码为零。
代码中的信号线只是设置它们忽略这些信号。Setpgrp不是必需的,它应该被设置。那么,你就错过了一些你需要做的事情。