Я хочу получать данные из двоичного кода на основе 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.info('stdout : ' + data);
});
cmd.stderr.on('data', function(data) {
console.info('stderr : ' + data);
});
cmd.stdout.on('end', function(data) {
console.info('end');
});
И что я ожидал:
00:00] 0
00:01] 1
00:02] 2
...
00:09] 9
00:10] 10
А я вижу:
00:10] 0
1
2
...
9
10
Похоже, что все stdout из двоичного файла будут сохранены в буфере, и после завершения двоичного кода будут отображаться все данные буфера. Я ожидаю, что cmd.stdout.on('data', callback) будет выполняться 10 раз, но он запускается только 1 раз.
Но я хочу получить результат как поток. Как я могу получать данные, такие как поток, или как я могу получать данные построчно в режиме реального времени?





By default, stdout in general is buffered until a newline is written. However, if stdout is not a tty (which is the case here with
child_process.spawn()), all output is buffered, regardless of newlines. You can disable stdout buffering entirely by doingsetbuf(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);
}
}