SETSID(2)

ИМЯ
setsid - создает сеанс и устанавливает идентификатор группы процесса

ОБЗОР
#include <sys/types.h>
#include <unistd.h>

pid_t setsid(void);

ОПИСАНИЕ
Вызов setsid() создаёт новый сеанс, если вызывающий процесс не является лидером группы процессов. Вызывающий процесс становится лидером нового сеанса (то есть, его ID сеанса становится равным ID самого процесса). Вызывающий процесс также становится лидером группы процессов новой группы процессов в сеансе (то есть, его ID группы процессов становится равным ID самого процесса).

Вызывающий процесс будет единственным в новой группе процессов и новом сеансе.

Изначально, новый сеанс не имеет управляющего терминала. О том, как сеанс получает управляющий терминал, смотрите в credentials(7).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается идентификатор (нового) сеанса вызывающего процесса. В случае ошибки возвращается (pid_t) -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EPERM
    Идентификатор группы процессов любого процесса равен PID вызывающего процесса. В этом случае, в частности, setsid() завершается неудачно, если вызывающий процесс уже является лидером группы процессов.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4.

ЗАМЕЧАНИЯ
Потомок, создаваемый с помощью fork(2), наследует ID сеанса своего родителя. Идентификатор сеанса сохраняется при вызове execve(2).

Лидер группы процессов — это процесс, идентификатор группы процессов которого равен идентификатору самого процесса (PID). Отказ лидера группы процессов выполнять setsid() предотвращает возможность того, что сам лидер группы процессов переместится в новый сеанс, в то время как другие процессы в группе останутся в первоначальном сеансе; это поломало бы жёсткую двухуровневую иерархию сценариев и групп процессов. Для того, чтобы setsid() выполнился успешно, вызовите fork(2) и в родителе _exit(2), а затем в дочернем процессе (который по определению не может быть лидером группы процессов) вызовите setsid().

Если сеанс имеет управляющий терминал, у которого не установлен флаг CLOCAL и возникает зависание (hangup) терминала, то лидеру сеанса посылается SIGHUP.

Если завершается процесс, который является лидером сеанса, то сигнал SIGHUP посылается каждому процессу в приоритетной (foreground) группе процессов управляющего терминала.

СМОТРИТЕ ТАКЖЕ
setsid(1), getsid(2), setpgid(2), setpgrp(2), tcgetsid(3), credentials(7), sched(7)