Получение/установка идентификатора группы процессов
Получение/установка идентификатора сессии
Каждый процесс принадлежит к сессии и группе процессов. Сессия создается для вас, когда вы входите в систему. Первый терминал, открытый лидером сессии, который не был уже ассоциирован с другой сессией, становится управляющим терминалом для этой сессии. Если при открытии терминала лидер сессии укажет флаг NOCTTY, терминал не станет управляющим. Это позволяет процессам-демонам выводить сообщения на системную консоль.
Управляющий терминал генерирует сигналы завершения и прерывания (quit и interrupt), а также сигналы управления заданиями. Управляющим терминалом для вашего shell'а является тот терминал, с которого вы вошли в систему. Управляющий терминал наследуется процессом, порожденным при помощи fork(2). Процесс может разорвать связь со своим управляющим терминалом, создав новую сессию с использованием setsid(2).
Если сессия так и не откроет управляющий терминал, соответствующий процесс будет называться «демоном» (daemon). Большинство системных сервисных процессов, таких, как init(1M), svc.startd(1M) crond(1M) или сетевых сервисов, таких, как sshd(1M), запускаются как демоны. Иногда демонами называют также системные процессы ttymon(1M), обслуживающие терминальные порты, хотя эти процессы имеют управляющие терминалы.
Если вызывающий процесс не является уже лидером группы процессов, setsid(2) устанавливает идентификаторы группы процессов и сессии вызывающего процесса равными его идентификатору процесса и отсоединяет его от управляющего терминала. setsid(2) создает новую сессию, превращая вызвавший процесс в лидера этой сессии. Новые сессии создаются чтобы:
1. отсоединить вызвавший процесс от терминала, так что этот процесс не будет получать от этого терминала сигналы SIGHUP, SIGINT и сигналы управления заданиями.
2. позволить процессу назначить новый управляющий терминал. Только лидер сессии может назначить управляющий терминал. Например, ttymon создает новую сессию и, таким образом, назначает управляющий терминал, когда пользователь входит в систему.
getsid(2) возвращает идентификатор сессии процесса с идентификатором, равным pid. Если pid равен нулю, getsid(2) возвращает идентификатор сессии вызвавшего процесса.
Этот пример показывает, как создать группу процессов, используя setpgid(2). Создаются три подпроцесса, и каждый распечатывает значение своего идентификатора группы процессов. Пример демонстрируется так:
$ setpgid
[6426] Original process group id: 179
[6426] New process group id: 6426
[6427] Process group id: 6426
[6428] Process group id: 6426
[6429] Process group id: 6426
Эта выдача предполагает, что программа запущена из sh. Любой процесс, запущенный с управляющего терминала, принадлежит основной группе. Таким образом, процесс изначально принадлежит к группе основных процессов. Затем, в строке 14, он становится лидером группы процессов. Его подпроцессы наследуют новый идентификатор группы процессов, и принадлежат той же группе, что и их родитель. Эта новая группа процессов будет фоновой, и поэтому не будет получать сигналы, связанные с терминалом. Если программа исполняется из ksh или bash, вывод будет выглядеть так:
$ setpgid
[6426] Original process group id: 6426
[6426] New process group id: 6426
[6427] Process group id: 6426
[6428] Process group id: 6426
[6429] Process group id: 6426
ksh создает новую группу процессов для каждой исполняемой команды. Поэтому setpgid(2) в строке 14 не делает ничего наблюдаемого, ведь процесс уже является лидером группы. Чтобы добиться более интересного поведения, можно сначала запустить sh, а только потом запускать программу, тогда при запуске программы лидером ее группы будет процесс sh.
Файл: setpgid.c
УСТАНОВИТЬ ИДЕНТИФИКАТОР ГРУППЫ ПРОЦЕССОВ - ПРИМЕР
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #define NUMCHILD 3
7 main()
8 {
9 int i;
11 printf("[%ld] Original process group id: %ld\n",