所以我試圖創建一個使用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;
}
工程很好,非常感謝答案! – Silas 2010-06-03 19:45:41