Как мне построчно прочитать 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;