c++ - Linux (Fedora 13) 与 OS X 中的 sigwait

标签 c++ pthreads signals

所以我正在尝试使用 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/

相关文章:

python - 在 Py3k 中,我如何让信号处理程序阻止信号的默认操作?

c - fgets()、信号 (EINTR) 和输入数据完整性

c++ - 需要将 Stack 插入 List

c++ - 需要一些帮助解决两个错误 (C++)

c++ - 为什么在Torch C++ API中就地Tensor方法是const?

c - 互斥锁和pthread_join的区别

c - 线程和进程的不同信号处理程序?可能吗

c++ - 在 Opencv 中加载 YML 文件 - 优化

c pthread_create 字符串参数

c++ - 如果堆分配的对象被销毁并且指针被重新分配,Qt 的信号和槽系统会工作吗?