2010-06-03 27 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