Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux(Fedora 13)与OS X中的sigwait_C++_Pthreads_Signals - Fatal编程技术网

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

C++ Linux(Fedora 13)与OS X中的sigwait,c++,pthreads,signals,C++,Pthreads,Signals,因此,我尝试使用pthreads创建一个信号处理程序,它可以在OSX和Linux上工作。下面的代码适用于OSX,但不适用于Fedora13 应用程序相当简单。它生成一个pthread,注册SIGHUP并等待信号。生成信号处理程序后,我在主线程中阻塞SIGHUP,因此信号应该只发送到信号处理程序线程 在OSX上,如果我编译、运行并将SIGHUP发送到它打印的“Got SIGHUP”进程,这一切都很好。在Linux上,它只是终止进程(并打印挂起)。如果我注释掉signal_handler pthre

因此,我尝试使用pthreads创建一个信号处理程序,它可以在OSX和Linux上工作。下面的代码适用于OSX,但不适用于Fedora13

应用程序相当简单。它生成一个pthread,注册SIGHUP并等待信号。生成信号处理程序后,我在主线程中阻塞SIGHUP,因此信号应该只发送到信号处理程序线程

在OSX上,如果我编译、运行并将SIGHUP发送到它打印的“Got SIGHUP”进程,这一切都很好。在Linux上,它只是终止进程(并打印挂起)。如果我注释掉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;
}
#包括
#包括
#包括
使用名称空间std;
void*信号处理器(void*arg){
int-sig;
sigset\u t集;
sigpemptyset(&set);
sigaddset(&set,SIGHUP);
while(true){
库特说:

set定义的信号应具有 呼叫时已被阻止 到
sigwait()
;否则,该行为 没有定义

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

pthread_sigmask(SIG_BLOCK, &set, NULL);
sigaddset()
之后立即调用
signal\u handler()
函数,然后它就会正常工作