что такое «лидеры сессий» в «ps»?

<p>что такое сессионные лидеры, как в <code>ps -d</code>, который выбирает все процессы, кроме руководителей сеансов?</p>

<p>в linux каждый процесс имеет несколько идентификаторов, связанных с ним, в том числе:</p><ul> <li> <p><strong> идентификатор процесса (pid) </strong><br> <br> это произвольное число, идентифицирующее процесс. каждый процесс имеет уникальный идентификатор, но после завершения процесса и получения родительским процессом статуса завершения идентификатор процесса освобождается для повторного использования новым процессом.</p> </li> <li> <p><strong> id родительского процесса (ppid) </strong><br> <br> это просто pid процесса, который запустил данный процесс.</p> </li> <li> <p><strong> id группы процессов (pgid) </strong><br> <br> это просто pid лидера группы процессов. если pid == pgid, то этот процесс является лидером группы процессов.</p> </li> <li> <p><strong> id сеанса (sid) </strong><br> <br> это просто pid лидера сеанса. если pid == sid, то этот процесс является лидером сеанса.</p> </li> </ul><p>сеансы и группы процессов - это просто способы рассматривать ряд связанных процессов как единое целое. все члены группы процессов всегда принадлежат одному и тому же сеансу, но сеанс может иметь несколько групп процессов.</p><p>обычно shell является лидером сеанса, и каждый конвейер, выполняемый этой shell, будет группой процессов. это сделано для того, чтобы было легче убивать детей из shell, когда она выходит. (смотрите <a href="http://www.kernel.org/doc/man-pages/online/pages/man3/exit.3.html">выход (3)</a> для подробностей.)</p><p>я не думаю, что есть специальный термин для члена сеанса или группы процессов, который не является лидером.</p>

<p>лидер сеанса - это процесс, в котором идентификатор сеанса == идентификатор процесса. это звучит надуманно, но идентификатор сеанса наследуется дочерними процессами. некоторые операции в unix/linux работают с сеансами процессов, например, сводят на нет идентификатор процесса при отправке системного вызова или команды kill. чаще всего это используется при выходе из командной консоли. ос отправит <code>kill -hup -$$, который отправит сигнал sighup (зависание) всем процессам с тем же идентификатором сеанса, что и в командной консоли. когда вы отказываетесь от процесса, идентификатор сеанса процесса изменяется из командной консоли, поэтому он не будет реагировать на сигнал зависания. это одна часть процесса, чтобы стать процессом демона.большинство процессов, вызываемых из оконного менеджера/графической среды, имеют тот же идентификатор сеанса, что и одна из программ запуска. это позволяет ос выполнять то же самое kill -hup -$$</code> работа со всеми программами: браузером, музыкальным проигрывателем, libreoffice, im-клиентом и т. д. это процессы, которые не являются лидерами сеансов.</p>

<p>я думал, что знаю ответ на этот вопрос, но я написал программу на c, чтобы понять это.</p><pre><code>#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; } </code></pre><p>я скомпилировал это с <code>cc -g -o sid sid.c</code> я запустил его несколькими различными способами, чтобы увидеть, что происходит:</p><pre><code>./sid nohup ./sid > sid.out setsid ./sid </code></pre><p>я был немного удивлен тем, что linux (2.6.39) вернул. я также нашел справочную страницу раздела 7 "учетные данные".</p><p>мой совет должен сделать <code>man 7 credentials</code> (или эквивалент, если не в linux) и прочитайте раздел о группе процессов и сеансе, чтобы узнать, сможете ли вы разобраться в этом.</p>