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