Je lis l'entrée de l'utilisateur de stdin
via std::getline()
, et je veux pouvoir quitter le programme par SIGINT. Malheureusement, std::getline()
ne semble pas se réveiller sur aucun signal. Par conséquent, le code ci-dessous n'abandonne qu'après avoir appuyé sur CTRL-C et RETURN.Réactiver std :: getline à travers le signal
#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;
}
}
Pourquoi est-ce ainsi? Est-ce que j'ai une chance de me réveiller std::getline()
sauf par l'utilisateur? Ou existe-t-il un autre moyen de lire stdin
, qui est également sensible aux signaux?
Bien que cela n'affecte pas le point sous-jacent, C++ 11 a ajouté la fonction 'std :: atomic_signal_fence' qui peut être synchronisée avec les gestionnaires de signaux. –