Odpowiedzi:
W systemie Linux każdy proces ma kilka powiązanych z nim identyfikatorów, w tym:
Identyfikator procesu (PID)
Jest to dowolny numer identyfikujący proces. Każdy proces ma unikalny identyfikator, ale po zakończeniu procesu i pobraniu przez proces nadrzędny statusu wyjścia identyfikator procesu może zostać ponownie wykorzystany przez nowy proces.
Identyfikator procesu nadrzędnego (PPID)
Jest to tylko PID procesu, który rozpoczął dany proces.
Identyfikator grupy procesów (PGID)
Jest to tylko PID lidera grupy procesów. Jeśli PID == PGID, to ten proces jest liderem grupy procesów.
Identyfikator sesji (SID)
Jest to tylko PID lidera sesji. Jeśli PID == SID, ten proces jest liderem sesji.
Sesje i grupy procesów są tylko sposobami traktowania wielu powiązanych procesów jako jednostki. Wszyscy członkowie grupy procesów zawsze należą do tej samej sesji, ale sesja może mieć wiele grup procesów.
Zwykle powłoka będzie liderem sesji, a każdy potok wykonywany przez tę powłokę będzie grupą procesów. Ma to na celu ułatwienie zabicia dzieci pocisków, gdy ta wyjdzie. (Zobacz wyjście (3), aby poznać szczegóły.)
Nie sądzę, aby istniał specjalny termin dla członka sesji lub grupy procesów, który nie jest liderem.
Lider sesji to proces, w którym identyfikator sesji == identyfikator procesu. Brzmi to wymyślone, ale identyfikator sesji jest dziedziczony przez procesy potomne. Niektóre operacje w systemie UNIX / Linux działają na sesjach procesów, na przykład negując identyfikator procesu podczas wysyłania do systemowej komendy lub komendy kill. Najczęstszym zastosowaniem tego jest wylogowanie się z powłoki. System operacyjny wyśle kill -HUP -$$
, który wyśle sygnał SIGHUP (rozłączenie) do wszystkich procesów z tym samym identyfikatorem sesji co powłoka. Kiedy odrzucasz proces, identyfikator sesji procesu jest zmieniany z powłoki, więc nie będzie reagował na sygnał zawieszenia. Jest to jedna z części procesu, który ma zostać procesem demona.
Większość procesów wywoływanych z menedżera okien / środowiska graficznego ma taki sam identyfikator sesji jak jeden z programów startowych. Umożliwia to kill -HUP -$$
systemowi operacyjnemu wykonanie tej samej operacji na wszystkich programach: takich jak przeglądarka, odtwarzacz muzyki, libreoffice, klient komunikatora itp. Są to procesy, które nie są liderami sesji.
Myślałem, że znam odpowiedź na to pytanie, ale napisałem program w C, aby to zrozumieć.
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t sid, mypid, pgid, gid;
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
if (!fork())
{
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("child PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
_exit(0);
}
return 0;
}
Kompilowałem to z cc -g -o sid sid.c
, uruchomiłem na kilka różnych sposobów, aby zobaczyć, co się stanie:
./sid
nohup ./sid > sid.out
setsid ./sid
Byłem trochę zaskoczony tym, co Linux (2.6.39) oddał. Znalazłem też stronę podręcznika sekcji 7, „poświadczenia”.
Moja rada to zrobić man 7 credentials
(lub odpowiednik, jeśli nie na Linuksie) i przeczytać sekcję o grupie procesów i sesji, aby sprawdzić, czy możesz to rozwiązać.
./sid
a nohup ./sid
, a po uruchomieniu setsid ./sid
, identyfikator sesji (SID) jest nowy i jest taki sam jak proces PID ... I” Nie jestem pewien, dlaczego nohup zapobiegł rozwidleniu (lub wydaje się, że tak), ale myślę, że mam ogólny pomysł ...
ps xao pid,ppid,pgid,sid,comm
do wyświetlania tych identyfikatorów.