我在电子项目中使用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);
});
});
答案 0 :(得分:2)
printf()
/ fprintf()
默认缓冲其输出。您可以在调用fflush(stdout);
后手动调用fprintf()
强制缓冲输出到stdout 或您可以使用setvbuf(stdout, NULL, _IONBF, 0);
完全禁用缓冲(必须这样做)一次和之前任何输出到stdout)。