当我在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
来尝试。