pthread_sigmask(3) - wariua/manpages-ko GitHub Wiki
pthread_sigmask - ๋ธ๋ก ๋ ์๊ทธ๋ ๋ง์คํฌ ์กฐ์ฌํ๊ณ ๋ฐ๊พธ๊ธฐ
#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
pthread_sigmask()
ํจ์๋ sigprocmask(2)์ ๋น์ทํ๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์์ ์ฌ์ฉ์ POSIX.1์์ ๋ช
์์ ์ผ๋ก ๋ช
์ธํ๊ณ ์๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. ๋ค๋ฅธ ์ฐจ์ด์ ๋ค์ ์ด ํ์ด์ง์์ ์ธ๊ธํ๋ค.
์ด ํจ์์ ์ธ์์ ๋์์ ๋ํ ์ค๋ช ์ sigprocmask(2)๋ฅผ ๋ณด๋ผ.
์ฑ๊ณต ์ pthread_sigmask()
๋ 0์ ๋ฐํํ๋ค. ์ค๋ฅ ์ ์ค๋ฅ ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
sigprocmask(2) ์ฐธ๊ณ .
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
pthread_sigmask() |
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
POSIX.1-2001, POSIX.1-2008.
์ ์ค๋ ๋๋ ์์ฑ์์ ์๊ทธ๋ ๋ง์คํฌ ์ฌ๋ณธ์ ๋ฌผ๋ ค๋ฐ๋๋ค.
glibc์ pthread_sigmask()
ํจ์์์๋ NPTL ์ค๋ ๋ฉ ๊ตฌํ ๋ด๋ถ์์ ์ฐ๋ ๋ ๊ฐ์ง ์ค์๊ฐ ์๊ทธ๋์ ๋ง์ผ๋ ค๋ ์๋๋ฅผ ์กฐ์ฉํ ๋ฌด์ํ๋ค. ์์ธํ ๋ด์ฉ์ nptl(7)์ ๋ณด๋ผ.
์๋ ํ๋ก๊ทธ๋จ์์๋ ์ฃผ ์ค๋ ๋์์ ๋ช ๊ฐ์ง ์๊ทธ๋๋ค์ ๋ง๊ณ ๋์ 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, (void *) &set);
if (s != 0)
handle_error_en(s, "pthread_create");
/* ์ฃผ ์ค๋ ๋์์ ๊ณ์ํด์ ๋ค๋ฅธ ์ค๋ ๋๋ค์ ๋ง๋ค๊ฑฐ๋ ๋ค๋ฅธ
์์
์ํ */
pause(); /* ํ๋ก๊ทธ๋จ ํ
์คํธ๋ฅผ ์ํ ์ค์ง */
}
sigaction(2), sigpending(2), sigprocmask(2), pthread_create(3), pthread_kill(3), sigsetops(3), pthreads(7), signal(7)
2019-03-06