Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 唤醒std::getline直通信号_C++_Signals_Stdin - Fatal编程技术网

C++ 唤醒std::getline直通信号

C++ 唤醒std::getline直通信号,c++,signals,stdin,C++,Signals,Stdin,我通过std::getline()从stdin读取用户输入,并希望能够通过SIGINT退出程序。不幸的是,std::getline()似乎没有在收到任何信号时醒来。因此,下面的代码只有在按下CTRL-C并返回后才会中止 #包括 #包括 #包括 bool abort=错误; 无效SigIntHandler(int signum){ STD::CUD>代码> STD::GETLION,输入/输出库一般在进程接收信号时没有指定的行为。C++库和语言不指定任何特定的行为。信号只被简单地提及,最值得注意的

我通过
std::getline()
stdin
读取用户输入,并希望能够通过SIGINT退出程序。不幸的是,
std::getline()
似乎没有在收到任何信号时醒来。因此,下面的代码只有在按下CTRL-C并返回后才会中止

#包括
#包括
#包括
bool abort=错误;
无效SigIntHandler(int signum){

STD::CUD>代码> STD::GETLION<代码>,输入/输出库一般在进程接收信号时没有指定的行为。C++库和语言不指定任何特定的行为。信号只被简单地提及,最值得注意的只是:

对函数信号的调用与任何结果同步 调用如此安装的信号处理程序

,以及头文件的枚举,是C++库中对信号引用的总和。信号是一个高度操作的系统特定特征,它不被C++库所覆盖。

<> P>这里讨论的C++库函数和类都没有信号安全性。在所示代码中,信号处理程序不能对输入流做任何事情,因为它的内部状态是不确定的,并且整个事件不是信号安全的。
因此,为了处理信号,有必要求助于低级操作系统特定的调用,如
open()
read()
、和
write(),而不是使用C++输入/输出库。当然,其中一个选项是编写自己的子类:“代码> STD::StRuBFENTER
键,嘿,这是你的节目)并返回。

虽然它不影响基本点,但C++11添加了可以与信号处理程序同步的函数
std::atomic\u signal\u fence
#include <csignal>
#include <string>
#include <iostream>

bool abort_ = false;

void SigIntHandler(int signum) {
  std::cout << "Received SIGINT" << std::endl;
  abort_ = true;
}


int main(int argc, char *argv[]) {
  signal(SIGINT, SigIntHandler);

  while (!abort_) {
    std::string line;

    std::cout << "> ";
    std::getline(std::cin, line);
    if (!std::cin)
      std::cin.clear();

    std::cout << line << std::endl;
  }
}