如何从 C++ 调用 sigaction

Aid*_*uff 5 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但由于某种原因它不起作用。编辑:“不起作用”,我的意思是编译器失败并表示没有 std::sigaction 函数或结构。

sigaction 是 C POSIX 不是吗?

PSk*_*cik 6

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");
  //...
}
Run Code Online (Sandbox Code Playgroud)