Как позвонить в sigaction из 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;
  }
}

Но по какой-то причине это не работает. РЕДАКТИРОВАТЬ: Под "не работает", я имею в виду, что компилятор не работает и говорит, что нет функции или структуры std::sigaction.

sigaction это C POSIX не так ли?

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");
  //...
}
Другие вопросы по тегам