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, и теперь он работает.

Другие вопросы по тегам