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