C编译二进制文件的Nodejs exec在标准输出上显示标准错误?

Posted

技术标签:

【中文标题】C编译二进制文件的Nodejs exec在标准输出上显示标准错误?【英文标题】:Nodejs exec for a C compiled binary displays stderr on stdout? 【发布时间】:2015-04-29 01:05:13 【问题描述】:

我基本上有一个 C 编译的二进制文件,如果在执行过程中遇到错误,错误将被转储到 stderr。这个 C 二进制文件包裹在 NodeJS 周围,其中二进制文件是通过子进程 exec 调用的。但是一旦出错,即使 C 代码将信息转储到标准错误,我似乎仍然在标准输出上获得 Nodejs 中的信息,而不是在标准错误上。因此,基本上运行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,或者我包含的一些错误模块可能导致这种情况发生。实际代码要写在这​​里相当大,但似乎我必须调查它可能出错的地方。

【问题讨论】:

你能告诉我们你的代码吗?另外,您是否为生成的进程尝试了 stderr 的事件处理程序?例如:my_spawned_process.stderr.on('data', function (dat) console.log(dat) ) 感谢@user2524973 的帮助,请参阅我发布的答案:) 很高兴你把它整理好了:) 【参考方案1】:

我似乎发现了问题所在。转储信息的遗留 C 代码从未提及传递给它的 FILE *。这就是所有信息都出现在标准输出上而不是标准错误上的原因。修复了 API 以 FILE * 作为参数并转储信息以更正 FILE 指针,现在它可以工作了。

【讨论】:

以上是关于C编译二进制文件的Nodejs exec在标准输出上显示标准错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs里调用执行系统命令

执行:显示标准输出“直播”

在 node.js 中运行 exec 时出现 error.code 139

调用 Runtime.exec 时捕获标准输出

将 exec 输出重定向到缓冲区或文件

ORA-03113: 在 os_command.exec 被重定向到标准输出之后,通信通道上的文件结尾