我正在编写一个与第三方应用程序交互的 NodeJS 脚本。第三方应用程序将在文件打开期间将数据写入文件。我希望我的 NodeJS 应用程序能够实时接收这些数据。
我的脚本创建一个 fifo:
child_process.spawnSync('mkfifo', [pipePath]);
然后,它使用 child_process.spawn
启动第 3 方应用程序。最后,它从管道中读取。
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);
});
如果第 3 方应用程序可以运行,则此方法非常有效。但是,在某些情况下,第 3 方应用程序将退出而不写入文件/FIFO。在这种情况下,我的脚本中的 fs.open() 调用将永远阻塞。 (请参阅 GitHub 上的 this related issue)
为了解决这个问题,我使用了
let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
这可以防止我的脚本在第 3 方应用程序失败时挂起,但现在“数据”事件永远不会被触发,即使第 3 方应用程序正常工作也是如此。我想知道使用 O_NONBLOCK 打开 FIFO 是否不算打开它进行读取?
我不确定解决此问题的最佳方法是什么。目前我正在考虑启动第 3 方应用程序,等待 10 秒,看看它是否仍在运行,然后打开 fifo 进行读取,因为如果第三方应用程序完全失败,它可能会很快失败。但这是一个黑客行为,所以我想知道更好的解决方案是什么。
谢谢!
最佳答案
当然,我一问问题就明白了。
let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDWR);
这会无阻塞地打开 fifo,因为它同时连接写入器和读取器。 fifo 可以有多个写入器,因此第 3 方应用程序仍然能够毫无问题地连接。
关于node.js - 在 NodeJS 中可靠地读取 FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492401/