Как мне получить результат от child_process.execFile live? - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу получать данные из двоичного файла на основе C в реальном времени, запустив Node.js.Я знаю, что Node.js может запускать исполняемый двоичный файл с помощью модуля child_process.

Поэтому я создаю простое приложение C / Node.js, как показано ниже:

// It will be compiled to a.out and run by below Node.js code
#include <stdio.h>

int main() {
    int i=0;
    for (i=0; i<10; i++) {
        printf("%d\n", i);
        sleep(1);
    }
}
var spawn = require('child_process').spawn;

var cmd = spawn('./a.out');

cmd.stdout.on('data', function(data) {
    console.log('stdout : ' + data);
});

cmd.stderr.on('data', function(data) {
    console.log('stderr : ' + data);
});

cmd.stdout.on('end', function(data) {
    console.log('end');
});

И что я ожидал:

00:00] 0
00:01] 1
00:02] 2
...
00:09] 9
00:10] 10

Но я вижу:

00:10] 0
1
2
...
9
10

Похоже, что весь стандартный вывод из двоичного файла будет сохранен в буфер, а после завершения двоичного файла все данные буфера будут отображены.Я ожидаю, что cmd.stdout.on ('data', callback) будет выполняться 10 раз, но он будет выполняться только 1 раз.

Но я хочу получить результат как поток.Как я могу получать данные как поток или как я могу данные построчно в реальном времени?

1 Ответ

0 голосов
/ 26 апреля 2019

По умолчанию стандартный вывод буферизуется до тех пор, пока не будет написана новая строка. Однако, если stdout не является tty (как в случае с child_process.spawn()), все выходные данные буферизуются независимо от перевода строки. Вы можете полностью отключить буферизацию стандартного вывода, выполнив setbuf(stdout, NULL).

Я попробовал следующее, оно работает.

#include <stdio.h>

int main() {

    setbuf(stdout, NULL);

    int i=0;
    for (i=0; i<10; i++) {
        printf("%d\n", i);
        sleep(1);
    }
}

Ссылка: это и это

...