Kau*_*are 5 pipe flush child-process node.js
我正在尝试在 node.js 上运行脚本,该脚本按顺序将数字发送到一个可执行文件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);
Run Code Online (Sandbox Code Playgroud)
a.out以下 C 程序的编译版本在哪里:
#include<stdio.h>
int main(){
int x;
while(scanf("%d",&x)!=EOF)
printf("%d\n",x*x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到以下输出:
sending 2
received 4
sending 3
events.js:72
throw er; // Unhandled 'error' event
^
Error: write after end
Run Code Online (Sandbox Code Playgroud)
更改毫秒值setTimeout只会延迟错误。显然,我试图发送到的数据a.out被缓冲并仅在我终止管道时发送。我如何手动冲洗它?
小智 2
我一整天都在做这件事。
问题是您生成的进程的 STDOUT 需要刷新它的输出缓冲区,否则它将一直保留在那里直到填满,在这种情况下您的代码将不会再次执行。
p.stdin.end() 仅用于结束进程,其本质是允许操作系统清除所有缓冲区。
您无法从节点执行此操作,因为这不是输出缓冲区的所有者。
这很烦人,但只要您可以控制脚本,您就可以在那里修改它,也许允许它采用命令行选项来设置自动刷新?
希望这个对你有帮助。
| 归档时间: |
|
| 查看次数: |
2155 次 |
| 最近记录: |