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()希望使调用进程成为新进程组的进程组负责人,因此在这种情况下失败).