Verwendung und Bedeutung von Sitzung und Prozessgruppe in Unix?

81

Unix-Prozesse haben eine Sitzungs-ID und sind Teil einer Prozessgruppe, die mit Funktionen wie setsid () / getpgrp () geändert / abgefragt werden kann.

Das Konzept einer Prozessgruppe und einer Sitzung entging mir jedoch immer. Könnte jemand erklären, welche Bedeutung unterschiedliche Sitzungen und Prozessgruppen haben - warum / wann möchte man eine neue Sitzung erstellen oder mehrere Prozesse in derselben Sitzung und / oder Prozessgruppe platzieren? ?

Habalusa
quelle

Antworten:

103

Eine Prozessgruppe ist eine Sammlung verwandter Prozesse, die alle gleichzeitig signalisiert werden können.

Eine Sitzung ist eine Sammlung von Prozessgruppen, die entweder an ein einzelnes Endgerät (als steuerndes Terminal bezeichnet ) oder an kein Terminal angeschlossen sind.

Sitzungen werden zur Jobsteuerung verwendet: Eine der Prozessgruppen in der Sitzung ist die Vordergrundprozessgruppe und kann von Terminalsteuerungszeichen signalisiert werden. Sie können sich eine Sitzung mit einem steuernden Terminal so vorstellen, dass sie einem "Login" auf diesem Terminal entspricht. (Daemons trennen sich normalerweise von jedem steuernden Terminal, indem sie eine neue Sitzung ohne eine erstellen.)

Wenn Sie beispielsweise some_appvon der Shell aus ausführen , erstellt die Shell eine neue Prozessgruppe und macht diese zur Vordergrundprozessgruppe der Sitzung. ( some_appMöglicherweise werden einige untergeordnete Prozesse erstellt. Standardmäßig sind sie Teil derselben Prozessgruppe.) Wenn Sie dann drücken ^Z, wird some_appder Prozessgruppe signalisiert, sie zu stoppen. und die Prozessgruppe der Shell wird wieder auf die Vordergrundprozessgruppe umgeschaltet. Dann bg %1würde zB die some_appProzessgruppe erneut starten , aber im Hintergrund laufen lassen.


Der POSIX.1-2008-Standard ist ziemlich gut lesbar (zumindest glaube ich das!) - werfen Sie einen Blick auf die Definitionen und die relevanten Abschnitte des Kapitels "Allgemeine Terminalschnittstelle" .

Matthew Slattery
quelle
3
Das ist eine sehr sehr gute Erklärung mit zusätzlichen Informationen, die später als Fragen aufgetaucht sein könnten
GP92
@MatthewSlattery sind terminalund terminal devicewerden im Dokument gleich erwähnt?
Alhelal
11

Job Control Shells bearbeiten ständig Sitzungen oder Prozessgruppen. Sie können mit einem einzigen Aufruf der POSIX- kill()Funktion das gleiche Signal an alle Prozesse in einer Prozessgruppe senden .

Der POSIX-Standard sagt:

Wenn pid größer als 0 ist, wird sig an den Prozess gesendet, dessen Prozess-ID gleich pid ist.

Wenn pid 0 ist, wird sig an alle Prozesse gesendet (mit Ausnahme eines nicht spezifizierten Satzes von Systemprozessen), deren Prozessgruppen-ID der Prozessgruppen-ID des Absenders entspricht und für die der Prozess die Berechtigung zum Senden eines Signals hat.

Wenn pid -1 ist, wird sig an alle Prozesse gesendet (mit Ausnahme eines nicht spezifizierten Satzes von Systemprozessen), für die der Prozess die Berechtigung hat, dieses Signal zu senden.

Wenn pid negativ ist, aber nicht -1, wird sig an alle Prozesse gesendet (mit Ausnahme eines nicht spezifizierten Satzes von Systemprozessen), deren Prozessgruppen-ID dem absoluten Wert von pid entspricht und für die der Prozess die Berechtigung zum Senden eines Signals hat .

Wenn beispielsweise eine Anmeldeshell beendet wird, wird ein SIGHUP-Signal an alle Programme in ihrer Prozessgruppe gesendet.

Wenn Sie Programme in den Vordergrund oder Hintergrund bearbeiten, verwenden Sie Prozessgruppen.

Es gibt auch Kontrollterminals, über die Sie sich Sorgen machen müssen. Von einem steuernden Terminal erzeugte Signale können an alle Programme in einer Prozessgruppe gesendet werden.

Jonathan Leffler
quelle