摘自:http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html#ss4.4
From here, the child process must get a unique SID from the kernel in order to operate. Otherwise, the child process becomes an orphan in the system.
如果子进程变成孤儿进程怎么办?为什么它需要自己的 sid?
答案1
*Nix 进程由 PID(进程 ID)、PPID(父进程的 PID)、GID(组 ID)和 SID(会话 ID)标识。您可以使用以下命令查看它们
ps xao pid,ppid,pgid,sid,comm
(包括该command
领域,IE引起该过程的命令)。
PID 和 PPID 很容易理解;GID 用于允许中断到达属于同一组的所有进程:假设您正在执行
find / -type f -name '*.pdf' | sort | less
并且您想要suspend
这个命令(Ctrl+ Z),您将需要暂停所有进程;为允许这样做,它们属于同一个 GID,并且中断将被传递给具有相同 GID 的所有进程。
SID(会话 ID)是创建会话的进程的 PID。同一会话中随后创建的所有进程都会继承此 SID,尽管它们可能具有不同的组 ID 和 PPID,并且它们肯定具有不同的 PID。
当相关会话终止时(例如通过注销),内核会终止属于相关会话且具有相同 SID 的所有进程。这样做的原因很明显:留下的进程会等待无法再到达的输入,或者会传递无人会查看的输出或错误消息。
为了使服务(我之前的回答没有考虑到您正在讨论的正是服务,抱歉我心不在焉)在启动它的会话注销后继续存在,它不能保留原始会话的 SID,否则它会在注销时被内核删除。因此需要一个新的 SID。如果您不为其分配新的 SID,它将继承运行它的会话的 SID,并且会在会话关闭时被终止,这很可能比您希望服务持续的时间要短得多。
您在上面提到的页面中还有另一个标准(但很可爱)的转折:fork
。这也是守护进程在其原始环境消失后继续存在的策略的一部分。您可能已经注意到,守护进程首先从其父进程中分叉,然后在开始工作之前立即关闭父进程。为什么?因为当终端关闭时,它会向其控制进程(shell)发送 SIGHUP 信号。这通常会导致连接到此 shell 的所有进程死亡,因为 shell 会将其收到的 SIGHUP 重新传输到其所有作业。但 shell 不会跟踪其孙子,因此守护进程在其起源的终端关闭后仍然存在。
一旦其中一个消失,将守护进程从会话和终端中分离对于其生存至关重要。