Надежное чтение из FIFO в NodeJS - PullRequest
0 голосов
/ 27 ноября 2018

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

Мой сценарий создает fifo:

child_process.spawnSync('mkfifo', [pipePath]);

Затем он запускает стороннее приложение, используя child_process.spawn.Наконец, он читает из канала.

let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY);

let stream = fs.createReadStream(null, {fd: pipeHandle, autoClose: false});

stream.on('data', d => {
    console.log(d.length);
});

Это прекрасно работает, если работает стороннее приложение.Однако при определенных обстоятельствах стороннее приложение будет завершено без записи в файл / FIFO.В этом случае вызов fs.open () в моем скрипте блокируется навсегда.(См. эту связанную проблему на GitHub)

В попытке исправить это я использовал

let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);

Это предотвращает зависание моего сценария в случае сбоя стороннего приложения, но теперь событие data никогда не запускается, даже если стороннее приложение работает правильно.Мне интересно, если открытие FIFO с O_NONBLOCK не считается открытием для чтения?

Я не уверен, что лучший способ решить это.В настоящий момент я рассматриваю возможность запуска стороннего приложения, ожидающего 10 секунд, проверяющего, запущено ли оно и ТОГДА открывающего fifo для чтения, так как стороннее приложение может быстро выйти из строя, если вообще не получится.Но это взлом, поэтому мне интересно, какое решение лучше.

Спасибо!

1 Ответ

0 голосов
/ 27 ноября 2018

Конечно, я выясняю это, как только задаю вопрос.

let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDWR);

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

...