2010-06-03 2 views
2

그래서 OS X과 Linux 모두에서 작동하는 pthreads를 사용하여 신호 처리기를 만들려고합니다. 아래 코드는 OS X에서 작동하지만 Fedora 13에서는 작동하지 않습니다.sigwait in Linux (Fedora 13) vs OS X

응용 프로그램은 매우 간단합니다. 그것은 pthread를 생성하고 SIGHUP을 등록하고 신호를 기다립니다. 시그널 핸들러를 생성 한 후에 나는 시그널이 signal_handler 쓰레드로 보내 져야만하기 때문에 메인 쓰레드에서 SIGHUP을 막는다.

OS X에서 컴파일이되면 실행하고 SIGHUP을 프로세스에 보내면 "SIGHUP"이 인쇄됩니다. 리눅스에서는 그냥 프로세스를 죽이고 Hangup을 출력한다. signal_handler pthread_create를 주석 처리하면 응용 프로그램이 죽지 않습니다.

나는 응용 프로그램이 sigwait과 블록에 도착하지만 신호 코드를 반환하는 대신 응용 프로그램을 죽이는 것을 알고 있습니다.

g++ test.cc -lpthread -o test 
./test & 
PID="$!" 
sleep 1 
kill -1 "$PID" 

test.cc

#include <pthread.h> 
#include <signal.h> 
#include <iostream> 

using namespace std; 

void *signal_handler(void *arg) { 
    int sig; 
    sigset_t set; 

    sigemptyset(&set); 
    sigaddset(&set, SIGHUP); 

    while (true) { 
    cout << "Wait for signal" << endl; 
    sigwait(&set, &sig); 
    if (sig == SIGHUP) { 
     cout << "Got SIGHUP" << endl; 
    } 
    } 
} 

int main() { 
    pthread_t handler; 
    sigset_t set; 

    // Create signal handler 
    pthread_create(&handler, NULL, signal_handler, NULL); 

    // Ignore SIGHUP in main thread 
    sigfillset(&set); 
    sigaddset(&set, SIGHUP); 
    pthread_sigmask(SIG_BLOCK, &set, NULL); 

    for (int i = 1; i < 5; i++) { 
    cout << "Sleeping..." << endl; 
    sleep(1); 
    } 

    pthread_join(handler, NULL); 
    return 0; 
} 

답변

3

The POSIX spec for sigwait()는 말한다 : 세트로 정의

신호가 가에서 차단 된 것이다

나는 다음 명령을 사용하여 테스트를 실행 통화 시간 ~ sigwait(); 그렇지 않으면 동작이 정의되지 않습니다.

이 작업을 수행하지 않습니다. 추가하는 경우 :

pthread_sigmask(SIG_BLOCK, &set, NULL); 

즉시 signal_handler() 함수에 sigaddset() 후, 다음 올바르게 작동합니다.

+0

위대한 작품에 감사드립니다. – Silas