【问题标题】:std::getline and posix signalsstd::getline 和 posix 信号
【发布时间】:2023-03-10 05:30:01
【问题描述】:

我有一个简单的程序,它启动一个循环计时器,然后进入解析任何输入数据的 getline 循环。然而,每当定时器信号出现时,它都会结束 getline 函数,看起来好像用户按下了回车键。我怎样才能阻止信号这样做?或者如果做不到这一点,我如何区分真正的返回压力和信号?后者不太理想,因为我必须在 400Hz 下运行这个微分代码。

下面是我目前用来获取一行的代码。空白输入将重新打印 APP > 行,而任何其他输入都会通过。

do
    {
        std::cin.clear();
        line.clear();
        std::cout << "APP > ";
        std::getline(std::cin, line);
    }
    while (line.length() == 0);

谢谢大家

马特

【问题讨论】:

  • 你没有检查std::cin的状态。我想知道是否在警报响起后设置了故障位。
  • 啊哈,这似乎是正确的。我之前曾尝试比较 failbit 和 badbit 的直接状态,但没有运气,但似乎使用 fail() 函数可以解决问题。谢谢!
  • 我已将评论作为答案,因此您可以关闭此问题。

标签: c++ timer posix getline


【解决方案1】:

您没有检查std::cin 的状态。我想知道是否在警报响起后设置了故障位。

【讨论】:

    【解决方案2】:

    我不明白您的问题,也无法重现。以下程序正确地从标准输入读取处理信号;两者都不会妨碍对方:

    #include <csignal>
    #include <cstdlib>
    #include <string>
    #include <iostream>
    
    void handle(int n)
    {
        static unsigned int count = 0;
    
        std::cout << "Signal: " << n << std::endl;  // not safe, I know...
    
        if (++count == 5)
        {
            std::cout << "Too many signals, goodbye!\n";
            std::exit(0);
        }
    }
    
    int main()
    {
        std::signal(SIGINT, handle);
    
        for (std::string line; std::getline(std::cin, line); )
        {
            std::cout << "You said: " << line << std::endl;
        }
    
        std::cout << "End of input, goodbye!\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2020-08-26
      相关资源
      最近更新 更多