[<<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 }