기본적으로 신호는 모든 스레드에 전달 될 수 있으며 어떤 신호를 가정해서는 안됩니다. 그러나 Posix 스레드는이를 제어 할 수 있습니다. 일반적으로 SIGALRM을 타이머와 함께 사용하지만 SIGHUP에 예제가 있으므로 여기에 워크 플로를 보여주기 위해 표시 할 것입니다.
int n;
sigset_t set;
struct sigaction disp;
bzero(&disp, sizeof(disp));
disp.sa_handler = SIG_IGN;
if (sigaction(SIGHUP, &disp, NULL) < 0) {
syslog(LOG_CRIT, "sigaction_main: %m");
_exit(1);
}
다음, 새로 만들어지는 스레드가 상속 마스크는이 신호가 차단되어 있는지 확인합니다 :
응용 프로그램이 메인 스레드를 시작
는 신호의 글로벌 처분 무시를 설정
sigemptyset(&set);
sigaddset(&set, SIGHUP);
if ((errno = pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0) {
syslog(LOG_CRIT, "sigmask_main: %m");
_exit(1);
}
이 시점에서 신호 (HUP)로 방해해서는 안되는 모든 스레드를 생성합니다. 이 작업이 모두 끝나면 주 스레드는 신호 대기 및 처리 전용 모드로 들어갑니다.
for (; ;) {
if ((errno = sigwait(&set, &n)) != 0) {
syslog(LOG_CRIT, "sigwait_main: %m");
_exit(1);
}
if (n == SIGHUP) {
/* do the errands */
}
}
[poll (2)] (http://man7.org/linux/man-pages /man2/poll.2.html) 및 Linux 전용 [signalfd (2)] (http://man7.org/linux/man-pages/man2/signalfd.2.html) 및 [timerfd_create (2)] (http://man7.org/linux/man-pages/man2/timerfd_create.2.html)? –