为什么组长无法在Linux中创建会话

时间:2014-12-17 10:29:43

标签: c linux unix process job-control

为什么组长无法创建会话。但是,除了能够创建会话的组长?

#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());       
}                   

请解释。

1 个答案:

答案 0 :(得分:4)

简短回答

POSIX禁止流程组负责人is required中的setsid()

  

如果调用进程不是进程组负责人,setsid()函数将创建一个新会话。

需要确保进程组的所有成员都是同一会话的成员

答案很长

流程组ID是流程组负责人的PID。会话ID是会话领导者的PID。成功setsid()调用后,进程组ID,会话ID和PID应该相同。

但是,对于进程组负责人,进程组ID已经等于PID。如果能够拨打setsid(),则其进程组ID保持不变,以便:

  • 流程组负责人属于新会话;
  • 其他进程组成员属于旧会话。

因此,在这种情况下,我们有一个流程组,其成员属于不同会话。 POSIX希望禁止这种情况。

<强>为什么吗

为工作控制发明了流程组和会话。进程组用于确定前景和背景组,以便前景组将从终端接收信号。

要实现此目的,终端会跟踪其当前的前台进程组,并在发生某些事件时向该组发送信号。

但是这假设来自任何给定进程组的所有进程共享相同的控制终端,因此终端发送的信号对它们有意义。

控制终端由以下规则共享:

  • 来自同一会话的所有进程共享同一个控制终端;
  • 来自不同会话的流程无法共享同一个控制终端。

因此,如果我们要求进程组的所有成员共享同一个控制终端,我们还应该要求他们是同一会话的成员

<强>参考

参见&#34; Linux编程接口&#34;,第34章(进程组,会话和作业控制)。