Программа C ++ не записывает в / dev / stdout, если не работает в терминале - PullRequest
0 голосов
/ 14 февраля 2019

Я уверен, что этот вопрос глуп, но я не знаком с C ++.Извините заранее.

Я работаю с dvbjet , программой с открытым исходным кодом, написанной на C ++.Он предназначен для непрерывной записи в файл, путь к которому можно указать с помощью аргументов командной строки.Но для моих целей я хочу прочитать вывод dvbjet в скрипт NodeJS.Сначала я пытался использовать именованный канал, но именованные каналы действительно не работают в NodeJS.Поэтому я хочу сделать вывод dvbjet в stdout, а не в файл.

Когда я запускаю dvbjet, (используя Node's child_process) я передаю / dev / stdout в качестве пути к выходному файлу.Но в NodeJS я никогда не вижу никаких данных, поступающих от дочерних процессов stdout.Если я использую node-pty (который имитирует tty), чтобы запустить его, я получаю вывод, но, к сожалению, node-pty преобразует вывод в строку, и когда я преобразую его обратно в двоичный файл (используя Buffer.from(str, 'utf8')), данные будут повреждены.

Так что, если я запускаю программу с / dev / stdout в качестве терминала, она работает.Но если я не терминал, нет выхода.Я подозреваю, что он буферизуется, а не сбрасывается.

Я пытаюсь отредактировать dvbjet, чтобы он сбрасывал стандартный вывод, но поскольку я не знаю, что я делаю, это вызов.Я также пытаюсь внести как можно меньше изменений в программу и убедиться, что она все еще работает при выводе в обычный файл.

В настоящее время dvbjet открывает файл следующим образом:

open(outputFile.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0664

И пишет так:

write(fd, buffer->start(), buffer->length());

Я пытался добавить flush(stdout); после вызова write(), но это не имело никакого значения.Я не уверен, что мог бы использовать для этого std :: flush, потому что dvbjet не использует std ostreams.

Я также пытался использовать команду stdbuf, как описано в thisсообщение в блоге , но безуспешно.

Я попытался поставить setbuf(stdout, NULL); в начале main, также безуспешно.

Я проверил, что проблема не в моем скрипте NodeJSиспользуя тот же код для запуска echo hi и проверки того, что stdout был обнаружен, и он был.

Я попытался добавить следующее:

fwrite(buffer->start(), 1, buffer->length(), stdout);
fflush(stdout);

Но он все равно не будет писатьна стандартный выводКажется, проблема не связана с использованием write () с / dev / stdout.Я действительно понятия не имею, где искать сейчас.

РЕДАКТИРОВАТЬ: После изучения этого, кажется, что либо открытый вызов или запись вызова блокируется при запуске с / dev / stdout.Таким образом, тесты, которые я пытался выполнить после очистки, не сработали, потому что этот код никогда не выполнялся.

...