为什么在节点块child_process.exec中打开fifo管道?



当我在bash中运行此命令时:

mkfifo im-a-pipe && node -e '
var fs = require("fs")
var childProcess = require("child_process")
console.log("pre-open")
fs.open("im-a-pipe", "w", function(err, fd){
if(err)
throw err
console.log("opened")
})
console.log("post-open")
childProcess.exec("echo wat")
console.log("YOU CAN NOT SEE MEEE")
'

我希望得到以下输出:

pre-open
post-open
YOU CAN NOT SEE MEEE

但是node在打印前两行之后等待:

pre-open
post-open

我认为这可能与管道阻塞有关,直到有东西打开另一边,但这种行为让我感到惊讶。

我错过了这些函数应该如何操作的东西吗?

这可能是您的操作系统中的错误,或者只是Node的旧版本。我在Mac上使用Node 4。一个同事能够在Debian上运行它,但直到他升级到Node 8。

这正是管道的工作原理(无论是命名的还是匿名的)。写入器会阻塞,直到另一端有读取器,而读取器在没有写入器的情况下会阻塞。你可以说这是一个基本原则。

下面是一个可以在命令行上执行的小演示。您将需要两个终端会话,我将它们称为A和b。

在:

mkfifo mypipe
ls > mypipe
会话A将被阻塞。现在在会话B:
cat mypipe

应该显示ls输出,并解除会话a的阻塞。

您也可以通过先执行cat来尝试。

最新更新