NAME

pthread_sigmask - 블록 된 시그널 마스크 조사하고 바꾸기

SYNOPSIS

#include <signal.h>

int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);

-pthread로 컴파일 및 링크.

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

pthread_sigmask():
_POSIX_C_SOURCE >= 199506L || _XOPEN_SOURCE >= 500

DESCRIPTION

pthread_sigmask() 함수는 sigprocmask(2)와 비슷하되 다중 스레드 프로그램에서의 사용을 POSIX.1에서 명시적으로 명세하고 있다는 차이가 있다. 다른 차이점들을 이 페이지에서 언급한다.

이 함수의 인자와 동작에 대한 설명은 sigprocmask(2)를 보라.

RETURN VALUE

성공 시 pthread_sigmask()는 0을 반환한다. 오류 시 오류 번호를 반환한다.

ERRORS

sigprocmask(2) 참고.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
pthread_sigmask() 스레드 안전성 MT-Safe

CONFORMING TO

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

NOTES

새 스레드는 생성자의 시그널 마스크 사본을 물려받는다.

glibc의 pthread_sigmask() 함수에서는 NPTL 스레딩 구현 내부에서 쓰는 두 가지 실시간 시그널을 막으려는 시도를 조용히 무시한다. 자세한 내용은 nptl(7)을 보라.

EXAMPLES

아래 프로그램에서는 주 스레드에서 몇 가지 시그널들을 막고 나서 sigwait(3)을 통해 그 시그널들을 가져오는 전용 스레드를 만든다. 다음 셸 세션이 사용 방식을 보여 준다.

$ ./a.out &
[1] 5423
$ kill -QUIT %1
Signal handling thread got signal 3
$ kill -USR1 %1
Signal handling thread got signal 10
$ kill -TERM %1
[1]+  Terminated              ./a.out

프로그램 소스

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

/* 간단한 오류 처리 함수 */

#define handle_error_en(en, msg) \
        do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static void *
sig_thread(void *arg)
{
    sigset_t *set = arg;
    int s, sig;

    for (;;) {
        s = sigwait(set, &sig);
        if (s != 0)
            handle_error_en(s, "sigwait");
        printf("Signal handling thread got signal %d\n", sig);
    }
}

int
main(int argc, char *argv[])
{
    pthread_t thread;
    sigset_t set;
    int s;

    /* SIGQUIT과 SIGUSR1 막기. main()이 만드는 다른 스레드들은
       이 시그널 마스크 사본을 물려받게 된다. */

    sigemptyset(&set);
    sigaddset(&set, SIGQUIT);
    sigaddset(&set, SIGUSR1);
    s = pthread_sigmask(SIG_BLOCK, &set, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_sigmask");

    s = pthread_create(&thread, NULL, &sig_thread, &set);
    if (s != 0)
        handle_error_en(s, "pthread_create");

    /* 주 스레드에서 계속해서 다른 스레드들을 만들거나 다른
       작업 수행. */

    pause();            /* 프로그램 테스트를 위한 중지 */
}

SEE ALSO

sigaction(2), sigpending(2), sigprocmask(2), pthread_attr_setsigmask_np(3), pthread_create(3), pthread_kill(3), sigsetops(3), pthreads(7), signal(7)


2021-03-22