Child_process没有捕获二进制文件输出?

时间:2017-08-02 19:13:51

标签: c node.js electron

我在电子项目中使用npm库'child_process'来捕获带有spawn的C程序的标准输出流。但是,当我尝试记录child.stdout.on('data')捕获的'printf'或'fprintf'的输出时,什么都没有显示出来。这是我的测试代码:

#include <stdio.h>
#include <string.h>

int main(){
    char buffer[256];
    int i = 0;
    while(1){
        snprintf(buffer, sizeof(buffer), "echo %d\n", i);
        printf("%s\n", buffer);
        fprintf(stdout, "%s\n", buffer);
        system(buffer);
        system("sleep 1");
        i++;
    }
    return 0;
}

我知道我的javascript是正确的,因为捕获了系统调用的回显线,并且我在ruby脚本和bash脚本中使用类似的循环测试了它,并且它们工作得很好。

当我在终端shell中运行二进制文件时,一切都输出正常,但当我尝试使用child.stdout.on捕获所有三个输出(第一行应为“echo 0 \ n echo 0 \ n 0”)时('data',(data)=&gt; {...});我回来的唯一一件事是,就像我说的那样,来自系统调用的“0”。我对解决方案感到茫然。

值得注意的是,当我在终端中运行这个程序时,我无法使用^ C来终止它,因为它只是被stdin拾取并带着输出屏幕。

如有必要,这是我的javascript:

const { spawn }= require('child_process');
let test;

// Invoked by a button that when clicked calls ipcRenderer.send('test');
ipcMain.on('test', (event, ...args) => {
  test = spawn('./a.out', []);
  test.stdout.on('data', (data) => {
    console.log(data);
  });
});

1 个答案:

答案 0 :(得分:2)

printf() / fprintf()默认缓冲其输出。您可以在调用fflush(stdout);后手动调用fprintf()强制缓冲输出到stdout 您可以使用setvbuf(stdout, NULL, _IONBF, 0);完全禁用缓冲(必须这样做)一次和之前任何输出到stdout)。