【问题标题】:Why does opening a fifo pipe in node block child_process.exec?为什么在节点块 child_process.exec 中打开 fifo 管道?
【发布时间】:2016-10-27 21:10:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript node.js bash mkfifo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这正是管道的工作方式(命名或匿名)。写入器将阻塞,直到另一端有读取器,而没有写入器的读取器将阻塞。你可以说这是一个基本原则。

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

      在 A 上:

      mkfifo mypipe
      ls > mypipe
      

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

      cat mypipe
      

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

      您也可以先通过cat 尝试此操作。

      【讨论】:

      • 是的,我知道管道会阻塞写入器,直到另一个进程打开管道进行读取,但这里发生了两件事:1)Node.js 通常使用非阻塞接口,而 childProcess.exec 应该't block 2) 进程甚至没有阻塞对管道的 open 调用。
      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2014-06-28
      相关资源
      最近更新 更多