我使用spawn从nodejs调用可执行的C程序,但是每次都不会刷新C程序。然后,我的节点程序只能输出子进程'缓冲区已满(4K)或子进程退出时的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同步中获取echo的输出?一件重要的事情是我无法修改echo.c,我只有二进制
答案 0 :(得分:0)
我发现execa对此有用。
答案 1 :(得分:0)
您需要阅读有关子进程/ forks的文档以及如何将子输出传递给父进程: https://nodejs.org/api/child_process.html#child_process_options_stdio
- &#39;管&#39; - 相当于[&#39; pipe&#39;,&#39; pipe&#39;,&#39; pipe&#39;](默认)
- &#39;忽略&#39; - 相当于[&#39;忽略&#39;,&#39;忽略&#39;,&#39;忽略&#39;]
- &#39;继承&#39; - 等同于[process.stdin,process.stdout,process.stderr]或[0,1,2]
在您的情况下,如果您不需要对输出执行更复杂的操作,则可以删除on.data
事件侦听器,并使用inherit选项初始化生成的进程。我已经修改了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();
});
答案 2 :(得分:0)
https://nodejs.org/dist/latest-v12.x/docs/api/process.html#process_a_note_on_process_i_o
Windows和POSIX之间有所不同。
如果在Windows上生成child_process,则只有TTY类型的stdout异步工作。
由于inherit
是TTY类型,因此process.stdout
选项使make异步进行child_process。