ИМЯ

setpgid, getpgid, setpgrp, getpgrp - устанавливает/получает группу процессов

LIBRARY

Standard C library ( libc, -lc)

СИНТАКСИС

#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
pid_t getpgrp(void);                            /* POSIX.1 version */
[[deprecated]] pid_t getpgrp(pid_t pid);        /* BSD version */
int setpgrp(void);                              /* System V version */
[[deprecated]] int setpgrp(pid_t pid, pid_t pgid);  /* BSD version */
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
getpgid():
    _XOPEN_SOURCE >= 500
        || /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
setpgrp() (POSIX.1):
    _XOPEN_SOURCE >= 500
        || /* Since glibc 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */ _SVID_SOURCE
setpgrp() (BSD), getpgrp() (BSD):
    [Доступно только в версиях glibc до 2.19]
    _BSD_SOURCE &&
        ! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE
            || _GNU_SOURCE || _SVID_SOURCE)

ОПИСАНИЕ

Все перечисленные интерфейсы доступны в Linux и используются для получения и установки идентификатора группы процессов (PGID). Предпочтительней использовать версию POSIX.1: getpgrp(void) — для получения PGID вызывающего процесса; setpgid() — для установки PGID вызывающего процесса.
Вызов setpgid() устанавливает PGID у процесса с идентификатором pid равным pgid. Если значение pid равно 0, то используется идентификатор вызывающего процесса. Если значение pgid равно 0, то PGID процесса, указанного в pid, становится равным его идентификатору процесса. Если setpgid() используется для перевода процесса из одной группы в другую (это делают некоторые оболочки командной строки для объединения каналов процессов), то обе группы процессов должны быть частью одного сеанса (см. setsid(2) и credentials(7)). В этом случае в pgid указывается существующая группа процессов, в которую нужно выполнить перевод и идентификатор сеанса этой группы должен совпадать с идентификатором сеанса переводимого процесса.
В версии POSIX.1 вызов getpgrp() без аргументов возвращает PGID вызывающего процесса.
Вызов getpgid() возвращает PGID процесса с заданным pid. Если значение pid равно нулю, то используется идентификатор вызывающего процесса (получение PGID процесса, отличного от вызывающего, требуется редко, а для этой задачи хорошо подходит POSIX.1 getpgrp()).
В версии System V вызов setpgrp() без аргументов эквивалентен setpgid(0, 0).
В версии BSD вызов setpgrp() с аргументами pid и pgid является обёрточной функцией, которая вызывает

setpgid(pid, pgid)

Начиная с glibc 2.19, BSD-функция setpgrp() была удалена из <unistd.h>; вызовы должны быть заменены на вызов setpgid(), как показано выше.
В версии BSD вызов getpgrp() с аргументом pid является обёрточной функцией, которая вызывает

getpgid(pid)

Начиная с glibc 2.19, BSD-функция getpgrp() была удалена из <unistd.h>; вызовы должны быть заменены на вызов POSIX.1 getpgrp(), который не имеет аргументов (если нужно получить PGID вызывающего), или на вызов getpgid(), как показано выше.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

On success, setpgid() and setpgrp() return zero. On error, -1 is returned, and errno is set to indicate the error.
Вызов getpgrp() (POSIX.1) всегда возвращает PGID вызывающего процесса.
getpgid(), and the BSD-specific getpgrp() return a process group on success. On error, -1 is returned, and errno is set to indicate the error.

ОШИБКИ

EACCES
Попытка изменить идентификатор группы процессов у одного из потомков вызывающего процесса, но потомок уже вызвал execve(2) (setpgid(), setpgrp()).
EINVAL
Значение pgid меньше 0 (setpgid(), setpgrp()).
EPERM
Попытка переместить процесс в группу процессов из другого сеанса или изменить идентификатор группы процессов у одного из потомков вызывающего процесса, но потомок находится в другом сеансе или изменить идентификатор группы процессов лидера сеанса ( setpgid(), setpgrp()).
ESRCH
Для getpgid(): нет процесса с указанным pid. Для setpgid(): значение pid не равно идентификатору вызывающего процесса или идентификатору потомка вызывающего процесса.

СТАНДАРТЫ

Вызов setpgid() и версия getpgrp() без аргументов соответствуют POSIX.1-2001.
В POSIX.1-2001 также определён вызов getpgid() и его версия setpgrp(), у которых нет аргументов (в POSIX.1-2008 определение setpgrp() помечено как устаревшее).
Версия getpgrp() с одним аргументом и версия setpgrp() с двумя аргументами появились из 4.2BSD и отсутствуют в POSIX.1.

ЗАМЕЧАНИЯ

Потомок, создаваемый с помощью fork(2), наследует идентификатор группы процессов своего родителя. Значение PGID сохраняется при вызове execve(2).
Каждая группа процессов является членом сеанса и каждый процесс является членом сеанса, в который входит его группа процессов (смотрите credentials(7)).
Сеанс может иметь управляющий терминал. В любой момент одна (и только одна) группа процессов в сеансе может являться приоритетной группой процессов (foreground process group) терминала; оставшиеся группы процессов выполняются в фоновом режиме. Если от терминала приходит сигнал (например, нажата клавиша прерывания и сгенерирован SIGINT), то сигнал посылается в приоритетную группу процессов (смотрите в termios(3) описание символов, для которых генерируются сигналы). Только приоритетная группа процессов может выполнять вызов read(2) для терминала; если группа процессов в фоновом режиме пытается выполнить read(2) для терминала, то группе посылается сигнал SIGTTIN, который приостанавливает её выполнение. Функции tcgetpgrp(3) и tcsetpgrp(3) используются для получения/установки приоритетной группы процессов у управляющего терминала.
Вызовы setpgid() и getpgrp() используются программами, например bash(1), для создания группы процессов с целью реализации управления заданиями оболочки командной строки.
Если завершение процесса лишает группу процессов главы и если любой из такой группы процессов остановлен, то каждому процессу в группе посылается сигнал SIGHUP с последующим SIGCONT. Осиротевшей считается группа процессов, у которой родитель каждого члена группы процессов сам является членом группы процессов или членом группы процессов другого сеанса (см. также credentials(7)).

СМ. ТАКЖЕ

getuid(2), setsid(2), tcgetpgrp(3), tcsetpgrp(3), termios(3), credentials(7)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Alexander Golubev <[email protected]>, Azamat Hackimov <[email protected]>, Hotellook, Nikita <[email protected]>, Spiros Georgaras <[email protected]>, Vladislav <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]