3

グループ リーダーがセッションを作成できない理由。しかし、セッションを作成できるグループリーダー以外は?

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

説明してください。

4

1 に答える 1

6

簡潔な答え

POSIXではsetsid()、プロセス グループ リーダーでの禁止が必要です

呼び出しプロセスがプロセス グループ リーダーでない場合、このsetsid()関数は新しいセッションを作成します。

プロセス グループのすべてのメンバーが同じセッションのメンバーであることを確認する必要があります。

長い答え

プロセスグループIDは、プロセスグループリーダーのPIDです。セッション ID は、セッション リーダーの PID です。呼び出しが成功setsid()すると、プロセス グループ ID、セッション ID、および PID が同じになります。

ただし、プロセス グループ リーダーの場合、プロセス グループ ID はすでに PID と同じです。を呼び出すことができる場合setsid()、そのプロセス グループ ID は同じままであるため、次のようになります。

  • プロセス グループ リーダーは新しいセッションに属します。
  • 他のプロセス グループ メンバーは古いセッションに属します。

したがって、この場合、異なるセッションに属するメンバーを持つプロセス グループがあります。POSIX は、この状況を禁止したいと考えています。

なんで?

プロセス グループとセッションは、ジョブ制御のために考案されました。プロセス グループは、フォアグラウンド グループとバックグラウンド グループを決定するために使用されるため、フォアグラウンド グループは端末から信号を受信します。

これを実装するために、ターミナルは現在のフォアグラウンド プロセス グループを追跡し、何らかのイベントが発生したときにそのグループにシグナルを送信します。

ただし、これは、特定のプロセスグループのすべてのプロセスが同じ制御端末を共有していることを前提としているため、端末によって送信されるシグナルはそれらにとって意味があります。

制御端末は、次のルールによって共有されます。

  • 同じセッションのすべてのプロセスは、同じ制御端末を共有します。
  • 異なるセッションのプロセスは、同じ制御端末を共有できません。

したがって、プロセス グループのすべてのメンバーが同じ制御端末を共有する必要がある場合は、それらが同じセッションのメンバーであることも要求する必要があります。

参照

「Linux プログラミング インターフェイス」の第 34 章 (プロセス グループ、セッション、およびジョブ制御) を参照してください。

于 2015-01-15T11:02:29.163 に答える