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

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

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

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

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

mkfifo MyPipe

Затем мы можем использовать cat для чтения из FIFO

cat MyPipe 

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

cat > MyPipe

И затем начнем что-то вводить, и каждый раз, когда вы нажимаете Enter, доходит до читателя. А затем, когда вы закрываете его с помощью 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 lib заканчиваются тем, что я получаю данные, но только после того, как отправитель использует file.close () в FIFO. Не когда он сбрасывает, как это происходит, когда я использую cat для чтения.

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

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;
6
задан Johan 5 October 2010 в 12:11
поделиться