2014-10-30 2 views
1

Linux POSIX 타이머 API를 사용하는 시스템에서 타이머 처리 모듈을 구현하고 싶습니다. 사용자는 타이머를 시작하고 콜백을 할 수 있습니다. 콜백 호출은 스레드 (신호 처리기가 아닌)에서 수행됩니다.Linux 타이머 알림 신호를 특정 스레드로 보낼 수 있습니까?

내가 SIGEV_SIGNAL와 timer_create()를 설정하는 생각을하고, 스레드,

어떻게 신호는 않습니다 (신호 인수가 필요한 콜백을 호출합니다되는 timerId가 줄 것이다)) (sigwaitinfo를 사용하여 신호를 기다리고 리눅스 커널에서 라우팅? 전송 된 스레드를 지정해야합니까?

+1

[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)? –

답변

2

기본적으로 신호는 모든 스레드에 전달 될 수 있으며 어떤 신호를 가정해서는 안됩니다. 그러나 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 */ 
} 
} 
+2

"기본적으로 모든 스레드에 신호가 전달됩니다. *"이것은 미혹입니다. 신호 처리는 프로세스별로 이루어집니다. 어떤 프로세스의 쓰레드라도 그것을받을 수는 있지만 프로세스의 쓰레드에 의해서만 수신 될 것입니다. – alk

+0

@alk : 정확합니다. 고맙습니다. 나는 그 답을 바로 잡았다. – wick

+0

감사합니다. 설명과 예가 도움이되었습니다. –

관련 문제