我怎样才能从nodejs刷新subprocess?

我使用spawn从nodejs调用一个可执行的C程序,但是C程序似乎没有每次都被刷新。 然后,当缓冲区已满(4K)或subprocess退出时,我的节点程序只能输出subprocess的stdout。

简单来说,这两个部分的代码应该是:

invoke.js

var spawn = require("child_process").spawn; var ps = spawn("./echo"); ps.stdout.on("data", (data) => { console.log(`${data}`); }); process.on("SIGINT", ps.kill); 

echo.c

 #include <stdio.h> #include <signal.h> #include <unistd.h> static volatile int keep = 1; void intHandler(int d){ keep = 0; } int main(){ signal(SIGINT, intHandler); int count = 0; while(keep) { printf("%d hello world!\r\n", ++count); sleep(1); } } 

我怎么能从invoke.js synchronus得到echo的输出? 一个重要的是我不能修改echo.c,我只有二进制

您需要阅读有关subprocess/分支的文档以及如何将子输出传递给父进程: https : //nodejs.org/api/child_process.html#child_process_options_stdio

  • 'pipe' – 相当于['pipe','pipe','pipe'](默认)
  • “忽略” – 等同于['忽略','忽略','忽略']
  • “inheritance” – 等同于[process.stdin,process.stdout,process.stderr]或[0,1,2]

在你的情况下,如果你不需要做更复杂的输出,你可以摆脱on.data事件监听器,并用inheritance选项初始化派生进程。 我已经修改了SIGINT事件绑定,以便更清楚地说明ps.kill被调用。

 var spawn = require('child_process').spawn; var ps = spawn('./echo', { stdio: 'inherit' }); process.on('SIGINT', function (){ console.log('sigint received'); ps.kill(); }); 

我发现execa是有用的。