如何从 C++ 调用 sigaction
How to call sigaction from C++
我知道如何在 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;
}
}
但由于某种原因它不起作用。
编辑:
"doesn't work",我的意思是编译器失败并表示没有 std::sigaction 函数或结构。
sigaction 是 C POSIX 不是吗?
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");
//...
}
我知道如何在 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;
}
}
但由于某种原因它不起作用。 编辑: "doesn't work",我的意思是编译器失败并表示没有 std::sigaction 函数或结构。
sigaction 是 C POSIX 不是吗?
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");
//...
}