【问题标题】:sigwait in Linux (Fedora 13) vs OS XLinux (Fedora 13) 与 OS X 中的 sigwait
【发布时间】:2010-06-03 04:15:11
【问题描述】:

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

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;
}

【问题讨论】:

    标签: c++ pthreads signals


    【解决方案1】:

    The POSIX spec for sigwait() 说:

    由 set 定义的信号应具有 在通话时被阻止 给sigwait();否则,行为 未定义。

    你没有这样做。如果添加:

    pthread_sigmask(SIG_BLOCK, &set, NULL);
    

    sigaddset() 之后立即添加到您的signal_handler() 函数,然后它可以正常工作。

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 2013-04-27
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多