用于C编译二进制文件的Nodejs exec在stdout上显示stderr?

时间:2015-02-26 15:16:42

标签: c node.js stdout stderr

我基本上有一个C编译二进制文件,其中如果在执行期间遇到错误,则错误被转储到stderr。这个C二进制文件包含在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倾倒了大量信息,或者我已经包含了一些可能导致这种情况发生的错误模块。实际代码在这里写得很大,但似乎我必须调查它可能出错的地方。

1 个答案:

答案 0 :(得分:0)

我似乎已经弄明白了这个问题。转储信息的遗留C代码从未引用传递给它的FILE *。这就是所有信息都出现在stdout而不是stderr上的原因。修复了API以将FILE *作为参数并转储出来以纠正FILE指针的信息,现在它可以正常工作。