我如何从child_process.execFile获得结果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何从child_process.execFile获得结果?相关的知识,希望对你有一定的参考价值。

我希望通过运行Node.js从基于C的二进制实时获取数据。我知道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
", 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

看起来所有来自二进制文件的stdout都将存储到缓冲区,并且在二进制文件终止后,将显示所有缓冲区数据。我希望cmd.stdout.on('data',callback)将运行10次,但它只运行1次。

但我想得到像流一样的结果。我如何获得像流一样的数据,或者我如何实时数据?

答案

默认情况下,stdout通常会被缓冲,直到写入换行符。但是,如果stdout不是tty(这是child_process.spawn()的情况),所有输出都是缓冲的,无论换行如何。您可以通过执行setbuf(stdout, NULL)完全禁用stdout缓冲。

我尝试了以下,它的工作原理。

#include <stdio.h>

int main() {

    setbuf(stdout, NULL);

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

参考:thisthis

以上是关于我如何从child_process.execFile获得结果?的主要内容,如果未能解决你的问题,请参考以下文章

我如何从 crudrepository 获取 entitymanager

我如何从反应模式引导中获得价值?

我如何从 pyspark 访问 couchbase

我如何从 HttpClient 获取承载令牌?

我如何从 AlamoFire 退货?

如何知道我应该从 BLOC 或 Cubit 中选择啥