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

Why does opening a fifo pipe in node block child_process.exec?

当我在 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

但是节点在打印前两行后等待:

pre-open
post-open

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

我是否遗漏了这些功能的运作方式?

这正是管道的工作方式(命名或匿名)。 writer 将阻塞,直到另一端出现 reader,而 reader 将在没有 writer 的情况下阻塞。你可以说这是一个基本原则。

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

在答:

mkfifo mypipe
ls > mypipe

会话 A 将阻塞。现在在会话 B:

cat mypipe

那应该显示 ls 输出,并取消阻止会话 A。

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

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