为什么在节点块 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。
当我在 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。