Я уверен, что этот вопрос глуп, но я не знаком с 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.Таким образом, тесты, которые я пытался выполнить после очистки, не сработали, потому что этот код никогда не выполнялся.