setsid(2) создает сеанс и устанавливает идентификатор группы процесса

ОБЗОР

#include <unistd.h>

pid_t setsid(void);

ОПИСАНИЕ

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

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

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

При успешном выполнении возвращается идентификатор (нового) сеанса вызывающего процесса. В случае ошибки возвращается (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().