Wie wird eine Prozessgruppen-ID festgelegt?

9

Ich habe gelesen, dass die ID einer Sitzung mit der PID des Prozesses übereinstimmt, der die Sitzung über den setsid()Systemaufruf erstellt hat, aber ich habe keine Informationen darüber gefunden, wie eine Prozessgruppen-ID festgelegt wird. Entspricht die Prozessgruppen-ID der PID des Prozesses, der die Prozessgruppe erstellt hat?

user7681202
quelle

Antworten:

10

Ja, im Allgemeinen entspricht die Prozessgruppen-ID der Prozess-ID des Prozesses, der die Prozessgruppe erstellt hat - und dieser Prozess hat die Prozessgruppe erstellt, indem er sich selbst in die Gruppe eingefügt hat.

Sie finden diese Informationen in der Dokumentation des setpgidSystemaufrufs und seiner Variante setpgrp. Die Details variieren historisch zwischen BSD und System V. Die häufigsten Anwendungsfälle sind:

  • Ein Prozess stellt sich in eine eigene Prozessgruppe, und die neue PGID entspricht der PID. Dies kann mit SysV erfolgen setpgrp()oder mit, setpgid(0, 0)wobei entweder 0durch eine explizite ersetzt werden kann getpid().
    Beachten Sie, dass der Prozess , während er sich in die Gruppe einfügt, in der Praxis häufig von einem Launcher (Shell oder Daemon-Monitor) ausgeführt wird, bevor das Programm ausgeführt wird , dh von Code im Launcher zwischen forkund execveim untergeordneten Prozess.
  • Ein Prozess fügt sich in derselben Sitzung in eine vorhandene Prozessgruppe ein. Shells tun dies für Pipelines: Um foo | barin einer eigenen Prozessgruppe ausgeführt zu werden, führt eine Shell normalerweise Folgendes aus:

    1. Richten Sie ein Rohr ein.
    2. Fork einen Prozess. Das Kind stellt sich in seine eigene Prozessgruppe G , schließt das Leseende der Pipe, verschiebt das Schreibende nach stdout und führt es dann aus foo.
    3. Fork einen Prozess. Das Kind fügt sich in die vorhandene Prozessgruppe G ein , schließt das Schreibende der Pipe und verschiebt das rote Ende nach stdin. Anschließend wird es ausgeführt bar.

    Der Aufruf von setpgidkann im übergeordneten Prozess anstelle oder zusätzlich zum untergeordneten Prozess ausgeführt werden. Wenn Sie dies in beiden Fällen tun, wird eine Rassenbedingung vermieden, falls die Initialisierung des zweiten Kindes die des ersten Kindes überholt.

  • Eine Shell mit Jobsteuerung wird normalerweise in einer eigenen Prozessgruppe ausgeführt. Vor dem Beenden oder Anhalten kehrt es jedoch zu seiner ursprünglichen Prozessgruppe zurück (dh es kehrt in die Prozessgruppe zurück, die es gestartet hat, vorausgesetzt, die Gruppe existiert noch).

Die POSIX-Spezifikation fürsetpgid beschreibt diese Anwendungsfälle. Es erklärt weiter, dass es nicht viel gibt, das garantiert funktioniert. Während alte BSD-Systeme es einem Prozess ermöglichten, einer Prozessgruppe in einer anderen Sitzung beizutreten oder eine neue PGID zu erstellen, ist dies bei den meisten modernen Systemen (einschließlich moderner BSD) nicht der Fall.

Gilles 'SO - hör auf böse zu sein'
quelle