4

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 ですね。

4

1 に答える 1

5

sigactionC++ 標準ではなく POSIX にあり、グローバル名前空間にあります。また、構造体と関数structを区別するためのキーワードも必要です。最後に、初期化コードは関数内にある必要があります。ファイル スコープ内に置くことはできません。sigactionsigaction

#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");
  //...
}
于 2018-08-19T18:18:38.613 に答える