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



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

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

2)

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

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

  1. Fork并让父进程退出
  2. 确保你不是工艺组组长。不需要在这里调用setpgrp,因为我们刚刚分叉,我们是进程组的成员,而不是leader。
  3. 创建一个新的会话(setsid),这保证我们没有控制终端。
  4. 我们从父类继承了所有的描述符,关闭不需要的描述符。
  5. 更改工作目录因此,您可能不想卸载某些已挂载的卷。
  6. 设置文件模式创建掩码为零。

代码中的信号线只是设置它们忽略这些信号。Setpgrp不是必需的,它应该被设置。那么,你就错过了一些你需要做的事情。

最新更新