2009-11-21 92 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

进入文本:
输入文本:
输入文本:
输入文本:

(中程序继续循环而不等待输入)

我该怎么办?

+0

你能描述你想实现什么?通常对于一个简单的程序来说,让信号具有预期的效果比较容易,即对于SIGINT,终止程序。此外,根据您的系统,使用信号处理程序中的高级io(如std :: cout)可能并不安全。 – 2009-11-21 11:47:46

+0

我正在尝试编写一个小shell程序。这只是一个例子来帮助我描述我的问题。 – ThP 2009-11-21 12:12:06

回答

4

尝试添加立即您cout语句之前如下:

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

不能使用'ignore()',因为我不知道用户什么时候会发送SIGINT,但是我认为clear()工作得不错。谢谢! – ThP 2009-11-21 12:15:26