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