如何从C ++调用sigaction

时间:2018-08-19 18:03:12

标签: c++ signals sigaction

我知道如何在C(带有signal.h)中使用它,但是<csignal>库是C ++提供的,我想知道它是否包含sigaction?我尝试运行它,但没有找到。我想知道我做错了什么吗?

#include <iostream>
#include <string>
#include <cstdio>
#include <csignal>

namespace {
  volatile bool quitok = false;
  void handle_break(int a) {
    if (a == SIGINT) quitok = true;
  }
  std::sigaction sigbreak;
  sigbreak.sa_handler = &handle_break;
  sigbreak.sa_mask = 0;
  sigbreak.sa_flags = 0;
  if (std::sigaction(SIGINT, &sigbreak, NULL) != 0) std::perror("sigaction");
}

int main () {
  std::string line = "";
  while (!::quitok) {
    std::getline(std::cin, line);
    std::cout << line << std::endl;
  }
}

但是由于某种原因,它不起作用。 编辑: “不起作用”是指编译器失败,并说没有std :: sigaction函数或struct。

签名是C POSIX吗?

1 个答案:

答案 0 :(得分:2)

sigaction在POSIX中,而不是C ++标准中,并且在全局名称空间中。 您还需要struct关键字来区分sigaction,结构, 和sigaction(函数)。 最后,初始化代码需要在函数中-您无法拥有它 在文件范围内。

#include <cstdio>
#include <signal.h>

namespace {
  volatile sig_atomic_t quitok = false;
  void handle_break(int a) {
    if (a == SIGINT) quitok = true;
  }
}

int main () {
  struct sigaction sigbreak;
  sigbreak.sa_handler = &handle_break;
  sigemptyset(&sigbreak.sa_mask);
  sigbreak.sa_flags = 0;
  if (sigaction(SIGINT, &sigbreak, NULL) != 0) std::perror("sigaction");
  //...
}