首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从C++调用sigaction

如何从C++调用sigaction
EN

Stack Overflow用户
提问于 2018-08-20 02:03:12
回答 1查看 5K关注 0票数 4

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

代码语言:javascript
复制
#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,不是吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 02:18:39

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

代码语言:javascript
复制
#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");
  //...
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51920435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档