2009-11-21 4 views
3

J'ai écrit ce programme simple:manutention SIGINT et getline

void sig_ha(int signum) 
{ 
cout<<"received SIGINT\n"; 
} 

int main() 
{ 
string name; 
struct sigaction newact, old; 
newact.sa_handler = sig_ha; 
sigemptyset(&newact.sa_mask); 
newact.sa_flags = 0; 
sigaction(SIGINT,&newact,&old); 

for (int i=0;i<5;i++) 
    { 
    cout<<"Enter text: "; 
    getline(cin,name); 
    if (name!="") 
     cout<<"Text entered: "<<name; 
    cout<<endl; 
    } 
return 0; 
} 

Si je frappe ctrl-c tandis que le programme attend l'entrée que je reçois la sortie suivante:
Entrer le texte: reçu SIGINT

Entrez texte:
Entrez le texte:
Saisir le texte:
Entrez le texte:

(la le programme continue la boucle sans attendre la saisie)

Que dois-je faire?

+0

Pouvez-vous décrire exactement ce que vous essayez d'atteindre? Habituellement, pour un programme simple, il est plus facile de laisser les signaux avoir l'effet escompté, c'est-à-dire pour SIGINT, de terminer le programme. En outre, en fonction de votre système, il peut ne pas être prudent d'utiliser un io de haut niveau (tel que std :: cout) à partir d'un gestionnaire de signal. –

+0

J'essaie d'écrire un petit programme shell. ceci est juste un exemple pour m'aider à décrire mon problème. – ThP

Répondre

4

Essayez d'ajouter ce qui suit immédiatement avant votre déclaration cout:

cin.clear(); // Clear flags 
cin.ignore(); // Ignore next input (= Ctr+C) 
+0

Impossible d'utiliser 'ignore()' car je ne sais pas quand l'utilisateur enverra SIGINT mais 'clear()' fonctionne assez bien je pense. Je vous remercie! – ThP