gpt4 book ai didi

node.js - 在 NodeJS 中可靠地读取 FIFO

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:25 34 4
gpt4 key购买 nike

我正在编写一个与第三方应用程序交互的 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com