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 setpgid
Systemaufrufs 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 0
durch 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 fork
und execve
im untergeordneten Prozess.
Ein Prozess fügt sich in derselben Sitzung in eine vorhandene Prozessgruppe ein. Shells tun dies für Pipelines: Um foo | bar
in einer eigenen Prozessgruppe ausgeführt zu werden, führt eine Shell normalerweise Folgendes aus:
- Richten Sie ein Rohr ein.
- 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
.
- 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 setpgid
kann 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