NAME

sigsuspend, rt_sigsuspend - 시그널 기다리기

SYNOPSIS

#include <signal.h>

int sigsuspend(const sigset_t *mask);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

sigsuspend():
_POSIX_C_SOURCE

DESCRIPTION

sigsuspend()는 일시적으로 호출 스레드의 시그널 마스크를 mask로 준 마스크로 교체하고서 처리 동작이 시그널 핸들러 호출이나 프로세스 종료인 시그널이 전달될 때까지 스레드 실행을 중지한다.

시그널이 프로세스를 종료시키는 경우에는 sigsuspend()가 반환하지 않는다. 시그널을 잡는 경우에는 시그널 핸들러 반환 후에 sigsuspend()가 반환하며, 시그널 마스크가 sigsuspend() 호출 전 상태로 복원된다.

SIGKILL이나 SIGSTOP을 막는 것은 불가능하다. mask에 이 시그널들을 지정해도 스레드의 시그널 마스크에 아무 영향을 주지 않는다.

RETURN VALUE

sigsuspend()는 항상 -1을 반환하며 오류(보통은 EINTR)를 나타내도록 errno를 설정한다.

ERRORS

EFAULT
mask가 프로세스 주소 공간의 유효한 일부가 아닌 메모리를 가리키고 있다.
EINTR
시그널에 의해 호출이 중단되었다. signal(7) 참고.

CONFORMING TO

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

NOTES

보통은 중요한 코드 구간 실행 동안의 시그널 전달을 막기 위해 sigprocmask(2)와 결합해서 sigsuspend()를 사용한다. 먼저 호출자가 sigprocmask(2)로 시그널을 막는다. 중요한 코드가 끝났을 때 sigprocmask(2)가 (oldset 인자로) 반환했던 시그널 마스크로 sigsuspend()를 호출해서 시그널을 기다린다.

시그널 집합 조작에 대한 자세한 내용은 sigsetops(3)를 보라.

C 라이브러리/커널 차이

원래 리눅스 시스템 호출의 이름은 sigsuspend()였다. 하지만 리눅스 2.2에 실시간 시그널이 추가되면서 그 시스템 호출이 지원하던 고정 크기 32비트 sigset_t 타입이 더는 용도에 맞지 않게 되었다. 그에 따라 확장된 sigset_t 타입을 지원하기 위해 새로운 시스템 호출 rt_sigsuspend()가 추가되었다. 새 시스템 호출에서 두 번째 인자로 size_t sigsetsize를 받는데, 이는 mask의 시그널 집합의 바이트 단위 크기를 나타낸다. 현재는 이 인자가 sizeof(sigset_t) 값을 가져야 한다. (안 그러면 EINVAL 오류가 난다.) glibc의 sigsuspend() 래퍼 함수에서 이런 세부 사항을 감추고 커널이 제공할 때 투명하게 rt_sigsuspend()를 호출한다.

SEE ALSO

kill(2), pause(2), sigaction(2), signal(2), sigprocmask(2), sigwaitinfo(2), sigsetops(3), sigwait(3), signal(7)


2021-03-22