【问题标题】:SIGINT handling and getlineSIGINT 处理和 getline
【发布时间】:2009-11-21 11:22:50
【问题描述】:

我写了这个简单的程序:

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)可能不安全。
  • 我正在尝试编写一个小型 shell 程序。这只是帮助我描述我的问题的一个例子。

标签: c++ linux signals sigint


【解决方案1】:

尝试在您的 cout 语句之前立即添加以下内容:

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

【讨论】:

  • 不能使用ignore(),因为我不知道用户何时会发送 SIGINT,但我认为clear() 工作得很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2016-11-09
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多