Получение и установка группы процессов первого плана.
tcsetpgrp(3С) устанавливает для терминала с дескриптором файла fildes идентификатор группы первого плана равным pgid. Помните, что процессы из основной группы получают сигналы, связанные с терминалом, такие как SIGINT и SIGQUIT. Если фоновый процесс попытается сделать tcsetpgrp(3С), он получит сигнал SIGTTOU. Например, если фоновый процесс попытается стать основным процессом, он получит этот сигнал. Фоновый процесс, однако, может проигнорировать или обработать этот сигнал.
Кроме того, фоновые процессы получают сигналы SIGTTIN и SIGTTOU при попытке читать с управляющего терминала или писать на него.
Командный процессор bash под SVR4 традиционно собирают с игнорированием SIGTTOU, поэтому фоновые процессы, запущенные из-под bash, не могут читать с терминала, но могут писать на него, так что их вывод может смешиваться с выводом текущей программы первого плана. Это сделано для совместимости с традиционными Unix-системами, где не было способа заблокировать вывод фоновых процессов.
tcgetpgrp(2) возвращает идентификатор группы основных процессов для терминала с дескриптором файла fildes.
tcgetsid(2) возвращает идентификатор сессии, для которой управляющим терминалом является терминал с дескриптором файла fildes.
Эта программа демонстрирует изменение группы процессов первого плана. Это одна из основных задач при управлении заданиями. Программа работает так:
11 Распечатывается начальный идентификатор группы для этого процесса.
13 Создается подпроцесс.
14-17 При помощи setpgid(2) создается новая группа.
19 Распечатывается новый идентификатор группы процессов.
21 Подпроцесс засыпает на 10 секунд.
26 Распечатывается идентификатор группы основных процессов. Родительский процесс принадлежит группе первого плана.
27 Так как родительский процесс принадлежит основной группе, во время исполнения вызова sleep(2), этот процесс может получать сигналы, связанные с терминалом. Например, пользователь может послать SIGINT и родительский процесс завершится.
28 Группа основных процессов изменяется вызовом tcsetpgrp(2). Теперь порожденный процесс принадлежит к основной группе.
30 Все связанные с терминалом сигналы будут получены подпроцессом и вызовут его завершение.
Из-под ksh или bash эта программа исполняется следующим образом:
$ 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 необходимо снова сделать основным процессом прежде, чем наш процесс завершится. Иначе пользователь будет выброшен из системы при завершении программы.