SIGINT处理和getline

3
我写了这个简单的程序:
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

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

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

我该怎么办?


你能描述一下你想要实现的目标吗?通常对于一个简单的程序,让信号产生预期的效果更容易,例如对于SIGINT,终止程序。此外,根据你的系统,从信号处理程序中使用高级IO(如std::cout)可能不安全。 - CB Bailey
我正在尝试编写一个小型的shell程序。这只是一个示例,以帮助我描述我的问题。 - ThP
1个回答

4

在你的cout语句之前添加以下内容:

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

无法使用 ignore(),因为我不知道用户何时会发送 SIGINT,但我认为 clear() 足够好了。谢谢! - ThP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接