Ответы:
В Linux каждый процесс имеет несколько идентификаторов, связанных с ним, в том числе:
Идентификатор процесса (PID)
Это произвольное число, идентифицирующее процесс. Каждый процесс имеет уникальный идентификатор, но после завершения процесса и получения родительским процессом статуса выхода идентификатор процесса освобождается для повторного использования новым процессом.
ID родительского процесса (PPID)
Это просто PID процесса, который запустил данный процесс.
ID группы процессов (PGID)
Это просто PID лидера группы процессов. Если PID == PGID, то этот процесс является лидером группы процессов.
Идентификатор сеанса (SID)
Это просто PID лидера сеанса. Если PID == SID, то этот процесс является лидером сеанса.
Сессии и группы процессов - это просто способы рассматривать ряд связанных процессов как единое целое. Все члены группы процессов всегда принадлежат одному и тому же сеансу, но сеанс может иметь несколько групп процессов.
Обычно оболочка будет лидером сеанса, а каждый конвейер, выполняемый этой оболочкой, будет группой процессов. Это сделано для того, чтобы легко убить потомков оболочки при выходе из нее. (См. Выход (3) для подробностей.)
Я не думаю, что есть специальный термин для члена сеанса или группы процессов, который не является лидером.
Лидер сеанса - это процесс, в котором идентификатор сеанса == идентификатор процесса. Это звучит надуманно, но идентификатор сеанса наследуется дочерними процессами. Некоторые операции в UNIX / Linux работают с сеансами процессов, например, сводят на нет идентификатор процесса при отправке системного вызова или команды kill. Наиболее распространенное использование для этого при выходе из оболочки. ОС отправит сообщение kill -HUP -$$
, которое отправит сигнал SIGHUP (зависание) всем процессам с тем же идентификатором сеанса, что и оболочка. Когда вы отказываетесь от процесса, идентификатор сеанса этого процесса изменяется из оболочки, поэтому он не будет реагировать на сигнал зависания. Это одна часть процесса, чтобы стать процессом демона.
Большинство процессов, вызываемых из оконного менеджера / графической среды, имеют тот же идентификатор сеанса, что и одна из программ запуска. Это позволяет ОС выполнять одну и ту же kill -HUP -$$
операцию над всеми программами: браузером, музыкальным проигрывателем, libreoffice, IM-клиентом и т. Д. Это процессы, которые не являются лидерами сеансов.
Я думал, что знаю ответ на этот вопрос, но я написал программу на C, чтобы понять это.
#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;
}
Я скомпилировал его с cc -g -o sid sid.c
помощью нескольких разных способов, чтобы увидеть, что происходит:
./sid
nohup ./sid > sid.out
setsid ./sid
Я был немного удивлен тем, что Linux (2.6.39) вернул. Я также нашел справочную страницу раздела 7 «Учетные данные».
Мой совет - сделать man 7 credentials
(или эквивалент, если не в Linux) и прочитать раздел о группе процессов и сеансе, чтобы узнать, сможете ли вы разобраться в этом.
./sid
и nohup ./sid
, и при запуске setsid ./sid
, то идентификатор сеанса (SID) является новым и так же , как процесс PID ... I» Я не уверен, почему nohup предотвратил форк (или, кажется,
ps xao pid,ppid,pgid,sid,comm
для просмотра этих идентификаторов.