Linux (Fedora 13) 与 OS X 中的 sigwait

Posted

技术标签:

【中文标题】Linux (Fedora 13) 与 OS X 中的 sigwait【英文标题】:sigwait in Linux (Fedora 13) vs OS X 【发布时间】: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;

【问题讨论】:

【参考方案1】:

The POSIX spec for sigwait() 说:

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

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

pthread_sigmask(SIG_BLOCK, &set, NULL);

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

【讨论】:

以上是关于Linux (Fedora 13) 与 OS X 中的 sigwait的主要内容,如果未能解决你的问题,请参考以下文章

高分悬赏:fedora 13修改为上海交大的源老是出现问题,如何解决???<详情见补充说明>

Qubes OS 4.1.2 正式发布,基于 Fedora 的安全 Linux 发行版

Mac OS X

linux (fedora 28) 制作启动U盘,启动盘

sh 翻译:“OS X 10.10 Yosemite本地开发环境,Apache,PHP和MySQL与Homebrew”13安装,配置PHP

以编程方式与 OS X 或 Linux 中的串行端口通信