2010-06-03 25 views
2

所以我試圖創建一個使用pthreads在OS X和Linux上工作的信號處理程序。下面的代碼適用於OS X,但不適用於Fedora 13.在Linux(Fedora 13)sigwait vs OS X

該應用程序非常簡單。它產生一個pthread,寄存器SIGHUP並等待一個信號。產卵後,信號處理程序I在主線程中阻塞SIGHUP,因此信號只能發送到signal_handler線程。

在OS X上,這工作正常,如果我編譯,運行併發送SIGHUP到它打印「Got SIGHUP」的進程。在Linux上它只是殺死進程(並打印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 2010-06-03 19:45:41