Nodejs exec для скомпилированного двоичного кода C отображает stderr на stdout?
У меня есть в основном скомпилированный двоичный файл C, в котором, если во время выполнения возникает ошибка, ошибка выводится в stderr. Этот двоичный файл C обернут вокруг NodeJS, где двоичный файл вызывается через дочерний процесс exec. Но в случае ошибки, даже несмотря на то, что код на C выводит информацию в stderr, я все же получаю информацию в Nodejs на stdout, а не на stderr. Итак, по сути работает console.log(stdout);
выдает информацию об ошибке, но console.log(stderr);
ничего не сбрасывает. Кто-нибудь имеет какие-либо идеи по этому поводу, и если мне нужно перенаправить эту информацию через другой носитель, чтобы я получил соответствующую информацию о stdout и stderr по сценарию NodeJS?
Я создал тестовую версию кода, и она, кажется, правильно отображает информацию в 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 ответ
Кажется, я понял проблему. Устаревший код C, который выводит информацию, никогда не ссылался на файл FILE *, передаваемый ему. По этой причине вся информация появилась на stdout, а не на stderr. Исправлен API, который принимал FILE * в качестве аргумента и выводил информацию для исправления указателя FILE, и теперь он работает.