std::cin et SIGINT - C++ - Programmation
Marsh Posté le 16-12-2003 à 16:58:03
Taz a écrit : ton code. |
voici un exemple simpliste, qui a le comportement que je décris.
au prompt il ne faut bien sûr rentrer qu'une seule commande.
tu fais C^d => ça envoie eof, qui est détécté, et ya pas de souçis. le C^c est bien détécté, mais cin.eof renvoie true.
Code :
|
Marsh Posté le 16-12-2003 à 17:41:53
je comprends pas trop ton fonctionnement, cela dit
1) if(cin >> dawa)
au cas ou il se passe autre chose.
ensuite si c'est du eof, ilf aut clearer, et nettoyer un peu tout le bordel
std::cin.ignore(std::numeric_limits<int>::max(), '\n');
Marsh Posté le 16-12-2003 à 17:48:28
je suis bien d'accord pour le nettoyage d'après la saisie, qui n'apparait pas dans ce code.
Ceci dit, le nettoyage du eof est bien fait dans le handler du SIGINT:
Code :
|
et quand j'éxecute cet exemple, le C^c fait bien passer dans le handler, qui fait le clear. Mais une fois revenu dans le processus pricipal, cin.eof() renvoie toujours true. Et c'est bien cela qui m'ennuie...
Marsh Posté le 16-12-2003 à 17:59:10
et les autres champs il ressemblent à quoi ? avec un clear() ?
Marsh Posté le 16-12-2003 à 18:58:29
Taz a écrit : et les autres champs il ressemblent à quoi ? avec un clear() ? |
Code :
|
résulat:
eof=1 good=0 bad =1 fail=1
Marsh Posté le 16-12-2003 à 19:12:47
faut nettoyer le reste alors. le plus simple, c'est peut-être de ne changer le eof qui si c'est le seul problème.
Marsh Posté le 17-12-2003 à 08:16:25
nettoyer quel reste? A priori, quand je fais std::cin.clear(), je me dis que tout devrait être nettoyé. Je me trompe? pour dire vrai, je ne vois pas bien comment nettoyer plus. me faut une nouvelle lessive qui nettoie encoire plus que l'actuelle, mais je sais pas laquelle...
Marsh Posté le 17-12-2003 à 11:36:04
Taz a écrit : fais avec des & et des && |
désolé, je ne comprends pas ce que tu veux dire. Tu peux préciser?
Marsh Posté le 16-12-2003 à 14:02:38
bonjour,
sous linux, j'ai le soucis suivant:
j'ai un process en attente sur std::cin. Je valide chaque entrée en testant std::cin.eof(). En dehors de cela, j'ai un handler pour les signaux SIGINT, SIGHUP et SIGPIPE. Lorsque l'utilisateur envoie un C^c à l'application, celle-ci reçoit bien un signal SIGINT, mais en plus std::cin.eof() renvoie true... J'ai bien essayé de std::cin.clear(std::ios::eofbit), mais rien n'y fait. C'est gênant car je voudrait pouvoir continuer mon process en lisant sur std::cin. Je ne vois pas bien où se trouve le problème et la relation entre SIGINT et l'entrée standard.
Avez vous une idée?