2009-11-21 7 views
3

Я написал эту простую программу:обработка SIGINT и 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; 
} 

Если я ударил Ctrl-C, а программа ожидает ввода я получаю следующий вывод:
Введите текст: получил SIGINT

Enter текст:
Введите текст:
Введите текст:
Введите текст:

(программа продолжает цикл без ожидания ввода)

Что мне делать?

+0

Можете ли вы описать то, что вы пытаетесь достичь? Обычно для простой программы легче дать сигналам ожидаемый эффект, т. Е. Для SIGINT, завершить программу. Кроме того, в зависимости от вашей системы может быть безопасно использовать высокий уровень io (например, std :: cout) из обработчика сигналов. –

+0

Я пытаюсь написать небольшую программу оболочки. это просто пример, который поможет мне описать мою проблему. – ThP

ответ

4

Попробуйте добавить сразу после до Вашего cout заявление:

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

Невозможно использовать 'ignore()', потому что я не знаю, когда пользователь отправит SIGINT, но 'clear()' работает достаточно хорошо, я думаю. Спасибо! – ThP