如何在node.js中手动将管道刷新到子进程?

时间:2013-05-02 01:34:56

标签: node.js pipe flush child-process

我正在尝试在node.js上运行一个脚本,该脚本按顺序将数字发送到可执行文件a.out,该文件将其平方并将结果写入其stdout。发生这种情况时,将发送下一个号码。这是代码:

var spawn = require('child_process').spawn;
var p = spawn("./a.out",[],{"stdio":"pipe"});
p.stdout.setEncoding("utf8");
p.stdout.on("data",function(data){
    var x = parseInt(data.trim()), y = Math.sqrt(x);
    console.log("received",x);
    if(++y===10) p.kill();
    else {
        console.log("sending",y);
        p.stdin.write(y+"\n");
    }
});
var start = 2;
console.log("sending",start);
p.stdin.write(start+"\n");
setTimeout(function(){ p.stdin.end(); },1000);

其中a.out是以下C程序的编译版本:

#include<stdio.h>
int main(){
    int x;
    while(scanf("%d",&x)!=EOF)
        printf("%d\n",x*x);
    return 0;
}

但是,我得到以下输出:

sending 2
received 4
sending 3

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: write after end

更改setTimeout中的毫秒值只会延迟错误。显然,当我终止管道时,我正在尝试发送到a.out的数据被缓冲并仅发送 。如何手动冲洗它?

1 个答案:

答案 0 :(得分:1)

我一整天都在努力。

问题是你生成的进程的STDOUT需要刷新它的输出缓冲区,否则它将一直存在直到它填满,在这种情况下你的代码将不再执行。

p.stdin.end()仅用于结束进程,从本质上讲,它允许操作系统清除所有缓冲区。

您不能从节点执行此操作,因为这不是输出缓冲区的所有者。

这很麻烦,但是只要您控制了脚本,就可以在那里修改它,也许允许它采用命令行选项来设置autoflush?

希望这有一些帮助。