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

标签 node.js pipe flush child-process

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

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 的数据正在缓冲并发送。如何手动冲洗?

最佳答案

我整天都在研究这个。

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

p.stdin.end() 仅用于结束进程,就其本质而言,允许操作系统清除所有缓冲区。

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

这很烦人,但只要您可以控制脚本,就可以在那里修改它,或许允许它使用命令行选项来设置自动刷新?

希望对您有所帮助。

关于node.js - 如何手动将管道刷新到 node.js 中的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329028/

相关文章:

sockets - NodeJS发送字符串

javascript - 在 Node.js 中执行顺序操作

python - 使用python从子进程读取输出

c++ - 非阻塞 TCP 套接字并在发送后立即刷新?

caching - 显式 openmp 刷新是否会导致缓存行刷新?

node.js - docker-compose 启动两个 Node 应用程序

mysql - MySQL 使用哪个版本的 UUID?

unix - 将 ImageMagick 输出从科学转换为十进制?

bash - 管道尾部输出到另一个脚本

c - 刷新输入缓冲区 C