我试图在node.js上运行一个脚本,该脚本按顺序将数字发送到可执行文件a.out,该文件将其平方并将结果写入其stdout.发生这种情况时,将发送下一个号码.这是代码: var spawn = require('child_pro
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()仅用于结束进程,从本质上讲,它允许操作系统清除所有缓冲区.
您无法从节点执行此操作,因为这不是输出缓冲区的所有者.
这很麻烦,但是只要您控制了脚本,就可以在那里修改它,也许允许它采用命令行选项来设置autoflush?
希望这个对你有帮助.