Я знаю, как использовать его в 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
находится в 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");
//...
}
Других решений пока нет …