如何从nodejs刷新子进程

时间:2016-10-17 13:19:47

标签: node.js child-process spawn

我使用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,我只有二进制

3 个答案:

答案 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。