为什么在节点块child_process.exec中打开一个fifopipe道?
当我在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
我在想,这可能与pipe道阻塞有关,直到有东西打开对方,但这种行为让我感到惊讶。
我是否错过了这些function应该如何运作?
这可能是您的操作系统中的一个错误,或者只是旧版本的Node。 在节点4的Mac上工作。一个同事能够在Debian上运行它,但是直到他升级到节点8。
这正是pipe道工作的方式(无论是命名还是匿名)。 作者将阻止,直到另一端有一个读者,读者会阻止没有一个作家。 你可以说这是一个基本原则。
以下是您可以在命令行上执行的一个小小的演示。 你将需要两个terminal会话,我会打电话给他们A和B.
在A:
mkfifo mypipe ls > mypipe
会话A将被阻止。 现在在会议B:
cat mypipe
这应该显示ls
输出,并取消阻止会话A.
你也可以先做cat
来试试。