用于 C 编译二进制文件的 Nodejs exec 在 stdout 上显示 stderr?
Nodejs exec for a C compiled binary displays stderr on stdout?
我基本上有一个 C 编译的二进制文件,如果在执行过程中遇到错误,错误将转储到 stderr。这个 C 二进制文件包裹在 NodeJS 周围,二进制文件是通过子进程 exec 调用的。但是一旦出错,即使 C 代码将信息转储到 stderr,我似乎仍然在 Nodejs 中的 stdout 上而不是在 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 指针,现在它可以工作了。
我基本上有一个 C 编译的二进制文件,如果在执行过程中遇到错误,错误将转储到 stderr。这个 C 二进制文件包裹在 NodeJS 周围,二进制文件是通过子进程 exec 调用的。但是一旦出错,即使 C 代码将信息转储到 stderr,我似乎仍然在 Nodejs 中的 stdout 上而不是在 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 指针,现在它可以工作了。