所以我正在尝试使用 pthreads 创建一个信号处理程序,它可以在 OS X 和 Linux 上运行。下面的代码适用于 OS X 但不适用于 Fedora 13。
应用程序相当简单。它生成一个 pthread,注册 SIGHUP 并等待信号。产生信号处理程序后,我在主线程中阻止 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"
测试.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;
}
最佳答案
The POSIX spec for sigwait()
说:
The signals defined by set shall have been blocked at the time of the call to
sigwait()
; otherwise, the behavior is undefined.
你没有这样做。如果您添加:
pthread_sigmask(SIG_BLOCK, &set, NULL);
在 sigaddset()
之后立即添加到您的 signal_handler()
函数,然后它会正常工作。
关于c++ - Linux (Fedora 13) 与 OS X 中的 sigwait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2963283/