关于node.js:在NodeJS中关闭对FIFO的可读流

 2021-04-09 

Close readable stream to FIFO in NodeJS

我正在像这样在nodejs中创建到Linux fifo的可读流:

1
var stream = FS.createReadStream('fifo');

一切正常,我可以从fifo接收数据。
我的问题是我希望有一种方法可以轻轻地关闭软件,因此我需要以某种方式关闭此流。

呼叫

1
process.exit();

没有任何作用,因为流被阻塞。

我还尝试通过调用未记录的方法stream.close()以及stream.destroy()来手动销毁流,如该问题的答案中所述。

我知道我可以使用process.kill(process.pid, 'SIGKILL')杀死自己的进程,但这感觉像是一个非常糟糕的hack,可能会对文件系统或数据库产生严重影响。

难道没有更好的方法来实现这一目标吗?

您可以尝试以下最小示例来重现我的问题:

1
2
3
4
5
6
7
8
9
var FS = require('fs');
console.log("Creating readable stream on fifo ...");
var stream = FS.createReadStream('fifo');
stream.once('close', function() {
    console.log("The close event was emitted.");
});
stream.close();
stream.destroy();
process.exit();

使用mkfifo fifo创建一个称为\\'fifo \\'的fifo后。

如何修改以上代码以正确关闭软件?


显式写入命名管道将取消阻止读取操作,例如:

1
2
require('child_process').execSync('echo""> fifo');
process.exit();