Группе процессов, ID которой совпадает с ID управляющего терминала, разрешено записывать в терминал и читать с него. Эта группа называется
Задания переходят из приоритетного режима в фоновый и обратно
В былые времена пользователи часто использовали последовательные терминалы, соединенные с модемами, для подключения к централизованным Unix-системам на мини-компьютерах. Когда пользователь закрывал соединение (вешал трубку), линия последовательной передачи обнаруживала отсоединение, и ядро посылало сигнал «отсоединение» всем подключенным к терминалу процессам.
Эта концепция остается: если возникает отключение (оборудование последовательной связи все еще существует и все еще используется), ядро посылает сигнал отсоединения приоритетной группе процессов. Если существует лидер сеанса, происходит то же самое.
9.2.2. Идентификация группы процессов: getpgrp()
getpgid()
Для совместимости с более старыми системами POSIX предоставляет множество способов получения сведений о группе процессов:
#include
pid_t getpgrp(void); /* POSIX */
pid_t getpgid(pid_t pid); /* XSI */
Функция getpgrp()
getpgid()
является расширением XSI. Она возвращает ID группы процессов для данного pid
группы процессов. pid
, равный 0, означает «группа процессов текущего процесса». Таким образом, 'getpgid(0)
' является тем же самым, что и 'getpgrp()
'. При обычном программировании следует использовать getpgrp()
.В BSD 4.2 и 4.3 также есть функция getpgrp()
getpgid()
, требуя аргумент pid
. Поскольку современные системы поддерживают POSIX, в новом коде следует использовать версию POSIX. (Если вы думаете, что это сбивает с толку, вы правы. Несколько способов для получения одного и того же результата является обычным итогом проектирования комитетом, поскольку комитет считает, что он должен удовлетворить каждого.)9.2.3. Установка группы процесса: setpgid()
setpgrp()
Две функции устанавливают группу процесса:
#include
int setpgid(pid_t pid, pid_t pgid); /* POSIX */
int setpgrp(void); /* XSI */
Функция setpgrp()
Функция setpgid()
exec
. Управляющая заданиями оболочка делает этот вызов после fork
exec
. Если сначала успешно завершится вызов родителя, он может перейти на следующую задачу, такую, как обработка других заданий или управление терминалом.)