[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Установить идентификатор группы процессов - Пример
Этот пример показывает, как создать группу процессов, используя
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, вывод будет выглядеть так:
$ 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 не делает ничего, потому что процесс
уже является лидером группы. Любой процесс, запущенный с управляющего
терминала, будет принадлежать к основной группе. Поэтому эти процессы
будут получать связанные с терминалом сигналы.
Файл: setpgid.c
УСТАНОВИТЬ ИДЕНТИФИКАТОР ГРУППЫ ПРОЦЕССОВ - ПРИМЕР
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #define NUMCHILD 3
6
7 main()
8 {
9 int i;
10
11 printf("[%ld] Original process group id: %ld\n",
12 getpid(), getpgid(0));
13
14 if (setpgid(0, 0) == -1) {
15 perror("");
16 exit(1);
17 }
18
19 printf("[%ld] New process group id: %ld\n",
20 getpid(), getpgid(0));
21
22 for (i = 0; i < NUMCHILD; i++ ) {
23 if (fork() == 0) { /* child */
24 printf("\n\t[%ld] Process group id: %ld\n",
25 getpid(), getpgid(0));
26 exit(0);
27 }
28 }
29 }