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::StRuBF
ENTER
键,嘿,这是你的节目)并返回。虽然它不影响基本点,但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;
}
}