我基本上有一个C编译的二进制文件,如果在执行过程中遇到错误,就会将错误转储到stderr。这个C二进制文件是围绕NodeJS封装的,在NodeJS中二进制文件是通过子进程exec调用的。但一旦出现错误,即使C代码将信息转储到stderr,我似乎仍然在stdout上的Nodejs中获得信息,而不是在stderr上。因此,实际上运行console.log(stdout);
会转储错误信息,但console.log(stderr);
不会转储任何信息。有人知道这一点吗?如果我需要通过不同的介质重定向这些信息,以便在NodeJS脚本上获得关于stdout和stderr的适当信息?
我创建了代码的测试版本,它似乎在stderr和stdout上正确显示了信息:
#include <stdio.h>
int main(){
fprintf(stderr, "Whoops, this is stderr");
fprintf(stdout, "Whoops, this is stdout");
return 0;
}
以及相应的NodeJS代码:
#!/usr/bin/env node
var exec = require('child_process').exec,
path = require('path');
var bin = path.join(__dirname, 'a.out');
var proc = exec(bin, function (error, stdout, stderr) {
console.log('stdout:', stdout);
console.log('stderr:', stderr);
});
proc.stdout.on('data', function (dat) { console.log(dat) });
这就是我得到的输出:
Whoops, this is stdout
stdout: Whoops, this is stdout
stderr: Whoops, this is stderr
不确定为什么在我的代码中会发生这种情况,可能是因为我同时向stdout和stderr转储了大量信息,或者我包含的一些错误模块可能导致了这种情况的发生。实际的代码在这里写得很大,但我似乎必须调查它可能出了什么问题。
我似乎已经解决了这个问题。转储信息的遗留C代码从未引用传递给它的FILE*。这就是所有信息都出现在stdout上而不是stderr上的原因。修复了API将FILE*作为参数并将信息转储到正确的FILE指针的问题,现在它可以工作了。