为什么组长无法创建会话。但是,除了能够创建会话的组长?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main() {
int pid;
int ppid=getppid();
if ( setsid() < 0)
perror("ERROR");
if((pid=fork()) == 0)
{
printf("proces1=%d %d\n",getpid(),getpgrp());
int s=getpgrp();
//setpgid(pid,pid);
if (setpgid(pid,0) < 0)
perror("ERROR");
printf("group after proces=%d %d\n",getpid(),getpgrp());
exit(0);
}
wait(0);
printf("group after proces=%d %d\n",getpid(),getpgrp());
}
请解释。
答案 0 :(得分:4)
简短回答
POSIX禁止流程组负责人is required中的setsid()
:
如果调用进程不是进程组负责人,
setsid()
函数将创建一个新会话。
需要确保进程组的所有成员都是同一会话的成员。
答案很长
流程组ID是流程组负责人的PID。会话ID是会话领导者的PID。成功setsid()
调用后,进程组ID,会话ID和PID应该相同。
但是,对于进程组负责人,进程组ID已经等于PID。如果能够拨打setsid()
,则其进程组ID保持不变,以便:
因此,在这种情况下,我们有一个流程组,其成员属于不同会话。 POSIX希望禁止这种情况。
<强>为什么吗
为工作控制发明了流程组和会话。进程组用于确定前景和背景组,以便前景组将从终端接收信号。
要实现此目的,终端会跟踪其当前的前台进程组,并在发生某些事件时向该组发送信号。
但是这假设来自任何给定进程组的所有进程共享相同的控制终端,因此终端发送的信号对它们有意义。
控制终端由以下规则共享:
因此,如果我们要求进程组的所有成员共享同一个控制终端,我们还应该要求他们是同一会话的成员。
<强>参考强>
参见&#34; Linux编程接口&#34;,第34章(进程组,会话和作业控制)。