Как построчно читать FIFO / именованный конвейер из приложения C ++ / Qt Linux?

Как построчно читать FIFO / именованный конвейер из приложения C ++ / Qt Linux?

Сегодня я могу открывать и читать из fifo из программы Qt, но я не могу заставить программу читать данные построчно. Qt читает весь файл, то есть он ждет, пока «отправитель» закроет свой сеанс.

Давайте рассмотрим пример с некоторыми командами оболочки, чтобы показать, что бы я хотел, чтобы приложение делало.

Сначала создайте FIFO

mkfifo MyPipe

Тогда мы можем использовать кошку, чтобы читать из fifo

cat MyPipe 

А потом мы отправляем некоторые данные с другим котом

cat > MyPipe

А потом начинайте что-то печатать, и каждый раз, когда вы нажимаете клавишу ввода, это приходит к читателю. И затем, когда вы закрываете его с помощью Ctrl + D, обе стороны заканчиваются.

Теперь отправителя легко создать с помощью QTextStream, вам просто нужно очистить, когда вы хотите отправить.

QFile file("MyPipe");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    return;

QTextStream out(&file);
for(int i=0; i<3; i++) {
    out << "Hello...: " << i << "\n";
    out.flush();
    sleep(2);
}

file.close();

Но тогда, чтобы написать небольшую читалку, которая читает строку за строкой, я сейчас застрял, все мои попытки с использованием библиотеки Qt заканчиваются тем, что я получаю данные, но не раньше, чем отправитель использует file.close () на fifo. , Не когда он смывает, как это происходит, когда я читаю с помощью кошки.

Как этот пример:

QFile file("MyPipe");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return 0;

QTextStream in(&file);
QString line;
do {
    line = in.readLine();
    qDebug() << line;
} while (!in.atEnd());


file.close();

Что мне не хватает?

Такое ощущение, что мне нужно использовать какой-то isReady или lineAvailable в потоке или что-то в этом роде, но я не могу найти в документах ничего подходящего ...

/Спасибо

Заметка:

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

FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
    printf("%c",c);
}
fclose(fp);

Обновить:

Когда я запускаю отладчик, программа висит на readLine () и не продолжает работу, пока другая сторона не закроет fifo.

И я получаю то же самое, используя ">>"

    line = in.readLine();
    in >> line;

Ответы на вопрос(4)

Ваш ответ на вопрос