Блокировка чтения из FIFO через объект ifstream - PullRequest
3 голосов
/ 26 января 2009

Я открываю файл FIFO как ifstream. Как только объект создан, поток блокируется, пока я не отправлю что-то в FIFO (что для меня нормально). Затем я вызываю getline(), чтобы получить данные из потока.

Как мне снова прочитать-заблокировать поток, пока в файл FIFO не будет записано больше данных?

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 января 2009

Я не тестировал этот код, но мне интересно, просто ли FIFO устанавливает бит EOF, когда вы читаете все доступные данные. В этом случае вы можете сделать это:

std::ifstream fifo;
std::string   line;
bool          done = false;

/* code to open your FIFO */

while (!done)
{
    while (std::getline(fifo, line))
    {
        /* do stuff with line */
    }
    if (fifo.eof())
    {
        fifo.clear();  // Clear the EOF bit to enable further reading
    }
    else
    {
        done = true;
    }
}

Если вы прочитали конец FIFO, выполните сброс и дождитесь дальнейших данных. Если произошла ошибка, все готово. Я получил идею об этом с этого сайта . Возможно, вам также придется закрыть и снова открыть FIFO в том же блоке, где вы выполняете сброс.

1 голос
/ 26 января 2009

Функция getline, предоставляемая <string>, возвращает ссылку на объект потока. Вы можете проверить этот объект на "доброту", чтобы увидеть, если он все еще открыт или произошла ошибка:

std::ifstream fifo;
std::string   line;

/* code to open your FIFO */

while (std::getline(fifo, line))
{
    /* do stuff with line */
}

Когда FIFO закрывается, тест while возвращает false, чтобы выйти из цикла. Каждая итерация цикла эффективно блокирует поток до тех пор, пока не будет готово больше данных.

0 голосов
/ 27 января 2009

Я использую поток следующим образом:

ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);

string CmdLine;

while (std::getline(_FifoInStream, CmdLine)) {
    cout << CmdLine << endl;
}

Я блокируюсь только когда инициализирую переменную _FifoInStream, т.е. открываю поток. После отправки данных в FIFO я проваливаюсь через блок while. Что мне нужно, так это читать из FIFO бесконечно каждый раз, когда блокируется чтение.

...