为什么在setsid()之前fork()

cer*_*ier 37 c unix linux system

fork()之前为什么setsid()要守护进程?

基本上,如果我想从其控制终端分离进程并使其成为进程组负责人:我使用setsid().

在没有分叉之前这样做是行不通的.

为什么?

use*_*104 52

首先:setsid()将使您的流程成为流程组的领导者,但它也会使您成为新会话的领导者.如果您只想获得自己的进程组,请使用setpgid(0,0).

现在,为了理解setsid()返回EPERM的实际原因,如果您已经是流程组负责人或会话负责人,您必须了解流程组和会话ID是从创建它们的流程的流程ID初始化的(因此引导它们,即对于会话领导者pid == sid和进程组领导者pid == pgid).进程组也无法在会话之间移动.

这意味着如果您是流程组负责人,并且允许创建新会话,那么sid和pgid将被设置为您的pid,使旧流程组中的其他流程处于奇怪的状态:他们的流程组负责人突然他们可能会在不同的会议中.并且这是不允许的,因此内核的EPERM.

现在如果你fork()一旦你既不是会话也不是进程组领导者,因此将你的sid和pgid设置为你的pid是安全的,因为这样的组中没有其他进程.

所以,也许,想一想,这一切都是有道理的.


caf*_*caf 18

需要fork()并进行子调用setsid()以确保进程调用setsid()不是进程组负责人(setsid()希望使调用进程成为进程组的进程组负责人,因此在这种情况下失败).