[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Пример - Группа основных процессов, связанная с терминалом

Эта программа демонстрирует изменение группы основных процессов. Это
полезно для программ, осуществляющих управление заданиями. Программа
работает так:
11   Распечатывается начальный идентификатор группы для этого
процесса.
13   Создается подпроцесс.
14-17     При помощи setpgid(2) создается новая группа.
19   Распечатывается новый идентификатор группы процессов.
21   Подпроцесс засыпает на 10 секунд.
26   Распечатывается идентификатор группы основных процессов.
Родительский процесс принадлежит основной группе.
27   Так как родительский процесс принадлежит основной группе, во
время исполнения вызова sleep(2), этот процесс может получать сигналы,
связанные с терминалом. Например, пользователь может послать SIGINT и
родительский процесс завершится.
28   Группа основных процессов изменяется вызовом tcsetpgrp(2). Теперь
порожденный процесс принадлежит к основной группе.
30   Все связанные с терминалом сигналы будут получены подпроцессом и
вызовут его завершение.
Из-под ksh эта программа исполняется следующим образом:
$ tcsetpgrp
Original PGID: 8260
New PGID: 8376
Foreground PGID: 8260  (terminal signals received by parent)
Foreground PGID: 8376  (terminal signals received by child)
child done
parent done

Из-под sh, shell необходимо снова сделать основным процессом прежде,
чем наш процесс завершится. Иначе пользователь будет выброшен из
системы при завершении программы.
Файл: tcsetpgrp.c
                  ПРИМЕР - ГРУППА ОСНОВНЫХ ПРОЦЕССОВ

 1 #include <sys/types.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <termios.h>
 5 #include <stdio.h>
 6
 7 main()
 8 {
 9    pid_t pid;
10
11    printf("Original PGID: %ld\n", getpgid(0));
12
13    if ((pid = fork()) == 0) {
14       if (setpgid(0, 0) == -1) {
15       perror("");
16       exit(1);
17       }
18
19       printf("New PGID: %ld\n", getpgid(0));
20
21       sleep(10);
22       printf("child done\n");
23       exit(0);
24    }
25
26    printf("Foreground PGID: %ld\n", tcgetpgrp(0));
27    sleep(5);  /* parent receives terminal signals */
28    tcsetpgrp(0, pid);
29    printf("Foreground PGID: %ld\n", tcgetpgrp(0));
30    wait(0);  /* child receives terminal signals */
31    printf("done parent\n");
32 }