Zastosowanie i znaczenie sesji i grupy procesów w systemie Unix?

83

Procesy uniksowe mają identyfikator sesji i są częścią grupy procesów - którą można zmienić / odpytywać za pomocą funkcji takich jak setsid () / getpgrp ().

Jednak koncepcja grupy procesów i sesji zawsze mi umykała, czy ktokolwiek mógłby wyjaśnić, jakie znaczenie mają odrębne sesje i grupy procesów - dlaczego / kiedy chce się utworzyć nową sesję lub umieścić kilka procesów w tej samej sesji i / lub grupie procesów ?

Habalusa
źródło

Odpowiedzi:

104

Grupa procesów to zbiór powiązanych procesów, które mogą być sygnalizowane jednocześnie.

Sesja jest zbiorem grup procesów, które są przyłączone do grupy jednego urządzenia końcowego (zwanej terminala sterującego ) przymocowanymi do każdego terminalu.

Sesje służą do sterowania zadaniami: jedna z grup procesów w sesji jest pierwszoplanową grupą procesów i można wysyłać sygnały za pomocą znaków sterujących terminala. Możesz myśleć o sesji z terminalem sterującym jako o „logowaniu” na tym terminalu. (Demony zwykle odłączają się od dowolnego kontrolującego terminala, tworząc nową sesję bez jednego).

np. jeśli uruchamiasz some_appz powłoki, powłoka tworzy dla niej nową grupę procesów i czyni ją pierwszoplanową grupą procesów sesji. ( some_appmoże utworzyć kilka procesów potomnych; domyślnie będą one częścią tej samej grupy procesów). Jeśli następnie naciśniesz ^Z, some_appgrupa procesów zostanie zasygnalizowana, aby ją zatrzymać; a grupa procesów powłoki jest ponownie przełączana na grupę procesów pierwszego planu. Wtedy np. Ponownie bg %1uruchomiłby some_appgrupę procesów, ale utrzymywałby ją w tle.


Standard POSIX.1-2008 jest dość czytelny (przynajmniej tak mi się wydaje!) - spójrz na definicje i odpowiednie sekcje rozdziału „Ogólny interfejs terminala” .

Matthew Slattery
źródło
3
To bardzo dobre wyjaśnienie z dodatkowymi informacjami, które mogły pojawić się później jako pytania
GP92
@MatthewSlattery są terminali są terminal devicewspomniane w dokumencie to samo?
alhelal
12

Powłoki kontroli zadań cały czas manipulują sesjami lub grupami procesów. Możesz wysłać ten sam sygnał do wszystkich procesów w grupie procesów za pomocą pojedynczego wywołania kill()funkcji POSIX .

Standard POSIX mówi:

Jeśli pid jest większy od 0, sig zostanie wysłany do procesu, którego identyfikator procesu jest równy pid.

Jeśli pid ma wartość 0, sig zostanie wysłany do wszystkich procesów (z wyłączeniem nieokreślonego zestawu procesów systemowych), których identyfikator grupy procesów jest równy identyfikatorowi grupy procesów nadawcy i dla których proces ma uprawnienia do wysyłania sygnału.

Jeśli pid wynosi -1, sig będzie wysłany do wszystkich procesów (z wyłączeniem nieokreślonego zestawu procesów systemowych), dla których proces ma pozwolenie na wysyłanie tego sygnału.

Jeśli pid jest ujemny, ale nie -1, sig zostanie wysłany do wszystkich procesów (z wyłączeniem nieokreślonego zestawu procesów systemowych), których identyfikator grupy procesów jest równy bezwzględnej wartości pid i dla których proces ma pozwolenie na wysyłanie sygnału .

Na przykład, gdy powłoka logowania kończy pracę, sygnał SIGHUP jest wysyłany do wszystkich programów w jej grupie procesów.

Kiedy manipulujesz programami na pierwszym planie lub w tle, używasz grup procesów.

Istnieją również terminale kontrolne, o które należy się martwić; sygnały generowane przez terminal sterujący mogą być wysyłane do wszystkich programów w grupie procesów.

Jonathan Leffler
źródło