【问题标题】:How to call sigaction from C++如何从 C++ 调用 sigaction
【发布时间】:2018-08-19 18:03:12
【问题描述】:

我知道如何在 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 函数或结构。

sigaction 是 C POSIX 不是吗?

【问题讨论】:

  • sigaction 不是标准 C++ 的一部分,因此能否使用它取决于您的实现
  • 无关:volatile bool 可能不够好。更多信息:set flag in signal handler
  • 描述“但由于某种原因它不起作用。”更详细。它不编译吗?信号没有得到处理?程序会崩溃吗? ...
  • "但它说没有找到" 什么没有找到? 什么说的?

标签: c++ signals sigaction


【解决方案1】:

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");
  //...
}

【讨论】:

  • 我应该使用&lt;signal.h&gt; 中的实现还是&lt;csignal&gt; 中的命名空间?
  • @AidenWoodruff signal.h 保证将其安装在 POSIX 平台上。我认为&lt;csignal&gt; 不是这样。
  • 为什么在未命名的命名空间中声明了quitok?
  • @SaeidYazdani AFAIK,它应该与将每个此类封闭声明声明为 static 具有相同的效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多