NAME

setsid - 세션 만들고 프로세스 그룹 ID 설정하기

SYNOPSIS

#include <unistd.h>

pid_t setsid(void);

DESCRIPTION

setsid()는 호출 프로세스가 프로세스 그룹 리더가 아니면 새 세션을 만든다. 호출 프로세스가 새 세션의 리더가 된다. (즉, 세션 ID가 프로세스 ID와 같게 된다.) 또한 호출 프로세스가 세션의 새 프로세스 그룹의 프로세스 그룹 리더가 된다. (즉 프로세스 그룹 ID가 프로세스 ID와 같게 된다.)

호출 프로세스가 새 프로세스 그룹과 새 세션의 유일한 프로세스가 된다.

처음에는 새 세션에 제어 터미널이 없다. 세션의 제어 터미널을 얻는 방법에 대해선 credentials(7)를 보라.

RETURN VALUE

성공 시 호출 프로세스의 (새로운) 세션 ID를 반환한다. 오류 시 (pid_t) -1을 반환하며 오류를 나타내도록 errno를 설정한다.

ERRORS

EPERM
어느 프로세스의 프로세스 그룹 ID가 호출 프로세스의 PID와 같다. 그러므로 호출 프로세스가 이미 프로세스 그룹 리더이면 setsid()가 실패한다.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, SVr4.

NOTES

fork(2)를 통해 생성된 자식이 부모의 세션 ID를 물려받는다. execve(2)를 거치면서 세션 ID가 유지된다.

프로세스 그룹 리더는 프로세스 그룹 ID가 PID와 같은 프로세스다. 프로세스 그룹 리더의 setsid() 호출을 허용하지 않는 건 어떤 프로세스 그룹 리더가 새 세션으로 이동하면서 같은 프로세스 그룹의 다른 프로세스는 원래 세션에 남게 될 가능성을 막기 위해서다. 만약 그렇게 되면 세션과 프로세스 그룹의 엄격한 2단계 계층 구조가 깨지게 된다. setsid()가 꼭 성공하게 하려면 fork(2)를 호출하고서 부모는 _exit(2) 시키고 (정의상 프로세스 그룹 리더일 수 없는) 자식에서 setsid()를 호출하면 된다.

세션에 제어 터미널이 있는데 그 터미널에 CLOCAL 플래그가 설정돼 있지 않으면 터미널이 끊길 때 세션 리더에게 SIGHUP 시그널이 전송된다.

세션 리더인 프로세스가 종료하면 제어 터미널의 전경 프로세스 그룹의 각 프로세스로 SIGHUP 시그널이 전송된다.

SEE ALSO

setsid(1), getsid(2), setpgid(2), setpgrp(2), tcgetsid(3), credentials(7), sched(7)


2021-03-22