std::getline и сигналы posix

У меня есть простая программа, которая запускает повторяющийся таймер, а затем переходит в цикл getline, анализируя любые входные данные. Однако всякий раз, когда появляется сигнал таймера, функция getline завершает работу, что выглядит так, как будто пользователь нажал клавишу ввода. Как я могу остановить сигнал, делающий это? Или, если это не так, как я могу отличить настоящий возврат от сигнала? Последнее менее желательно, так как тогда мне придется запускать этот код дифференцирования на частоте 400 Гц.

Ниже приведен код, который я сейчас использую для получения строки. Пустой ввод будет повторно печатать строку APP>, в то время как любой другой ввод будет пропущен.

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

Спасибо всем

Мэтт


person Matthew Watson    schedule 09.11.2012    source источник
comment
Вы не проверяете состояние std::cin. Интересно, устанавливается ли failbit после срабатывания будильника.   -  person Robᵩ    schedule 10.11.2012
comment
Ага, вроде правильно. Ранее я безуспешно пытался сравнить прямое состояние failbit и badbit, но, похоже, использование функции fail() помогает. Спасибо!   -  person Matthew Watson    schedule 10.11.2012
comment
Я сделал комментарий ответом, поэтому вы можете закрыть этот вопрос.   -  person Robᵩ    schedule 10.11.2012


Ответы (2)


Вы не проверяете состояние std::cin. Интересно, устанавливается ли failbit после срабатывания будильника.

person Robᵩ    schedule 09.11.2012

Я не понимаю вашей проблемы и не могу воспроизвести ее. Следующая программа правильно читает из стандартного ввода и обрабатывает сигналы; ни один не мешает другому:

#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";
}
person Kerrek SB    schedule 09.11.2012