Risposte:
In Linux, a ogni processo sono associati diversi ID, tra cui:
ID processo (PID)
Numero arbitrario che identifica il processo. Ogni processo ha un ID univoco, ma dopo che il processo termina e il processo padre ha recuperato lo stato di uscita, l'ID processo viene liberato per essere riutilizzato da un nuovo processo.
Parent Process ID (PPID)
Questo è solo il PID del processo che ha avviato il processo in questione.
Process Group ID (PGID)
Questo è solo il PID del leader del gruppo di processi. Se PID == PGID, questo processo è un leader del gruppo di processi.
ID sessione (SID)
Questo è solo il PID del leader della sessione. Se PID == SID, questo processo è un leader della sessione.
Le sessioni e i gruppi di processi sono solo modi per trattare una serie di processi correlati come un'unità. Tutti i membri di un gruppo di processi appartengono sempre alla stessa sessione, ma una sessione può avere più gruppi di processi.
Normalmente, una shell sarà un leader della sessione e ogni pipeline eseguita da quella shell sarà un gruppo di processi. Questo per rendere più facile uccidere i bambini di una shell quando esce. (Vedi uscita (3) per i dettagli cruenti.)
Non credo che esista un termine speciale per un membro di una sessione o di un gruppo di processi che non sia il leader.
Un leader di sessione è un processo in cui ID sessione == ID processo. Sembra forzato, ma l'id di sessione è ereditato da processi figlio. Alcune operazioni all'interno di UNIX / Linux operano su sessioni di processo, ad esempio negando l'id di processo durante l'invio alla chiamata o al comando del sistema kill. L'uso più comune per questo è quando ci si disconnette da una shell. Il sistema operativo invierà kill -HUP -$$
, che invierà un segnale SIGHUP (hangup) a tutti i processi con lo stesso ID di sessione della shell. Quando rinneghi un processo, l'ID di sessione del processo viene modificato dalla shell, quindi non risponderà al segnale di riaggancio. Questa è una parte del processo per diventare un processo daemon.
La maggior parte dei processi richiamati dal gestore di finestre / dall'ambiente grafico hanno lo stesso ID di sessione di uno dei programmi di avvio. Ciò consente al sistema operativo di eseguire la stessa kill -HUP -$$
operazione su tutti i programmi: come browser, lettore musicale, libreoffice, client di messaggistica istantanea, ecc. Questi sono i processi che non sono leader della sessione.
Pensavo di conoscere la risposta a questo, ma ho scritto un programma C per capirlo.
#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;
}
L'ho compilato con l' cc -g -o sid sid.c
ho eseguito in diversi modi, per vedere cosa succede:
./sid
nohup ./sid > sid.out
setsid ./sid
Sono stato un po 'sorpreso da ciò che Linux (2.6.39) ha restituito. Ho anche trovato la pagina man della sezione 7, "credenziali".
Il mio consiglio è di fare man 7 credentials
(o l'equivalente se non su Linux) e leggere la sezione relativa al gruppo di processo e alla sessione per vedere se riesci a risolverlo.
./sid
e nohup ./sid
, e quando si esegue setsid ./sid
, l'ID sessione (SID) è nuovo ed è uguale al PID del processo ... I ' Non sono sicuro del perché Nohup abbia impedito la forcella (o sembra), ma penso di avere l'idea generale ...
ps xao pid,ppid,pgid,sid,comm
per visualizzare questi ID.