无法从子进程的标准输出中获取任何内容

时间:2014-03-08 19:18:04

标签: c node.js parent-child stdout

我正在尝试创建一个非常简单的nodejs服务器来接收post请求并将它们提供给一个简单的C程序,该程序通过stdin和stdout生成所有I / O.我正在尝试使用以下脚本作为测试:

var prc = require('child_process').spawn('./example');

// )none of these made it work)
prc.stdout.setEncoding('ascii');
//prc.stdout.setEncoding('utf8');

prc.stdout.on('data', function (data) {
    console.log("child said something: " + data);
});

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

prc.on('close', function (code) {
    console.log('process exit code ' + code);
});

setInterval(function() {
    console.log("gonna write");
    prc.stdin.write("prueba inicial\n");
    console.log("wrote");
}, 2000);

example.c包含:

int main() {
    int i;
    size_t size;
    char *line = NULL;

    for (i=0;;++i) {
        printf("\ngive me data: ");
        if (getline(&line, &size, stdin) != -1) {
            if (strcmp(line, "end\n") == 0) {
                break;
            }
            printf("result: %d, %d\n", i, i*2);
        }
    }

    return 0;
}

但我在屏幕上唯一得到的是

gonna write
wrote
gonna write
wrote
gonna write
wrote

我知道example正在投放,但为什么我没有通过prc.stdout获得任何内容?

PD:可能最好使用套接字或其他东西与example进行通信,但这只是对我将使用另一个C程序的真实项目的测试。改变。

2 个答案:

答案 0 :(得分:2)

需要fflush(stdout)的原因是,因为stdio检测到您没有在终端中运行,所以默认情况下不会在'\n'上刷新,以提高数据吞吐量。

因此您可以显式刷新,或者只需使用

更改C代码中的缓冲模式
setvbuf(stdout, NULL, _IOLBF, 0);

阅读this man page以了解详情。

答案 1 :(得分:0)

显然是在每stdout之后修复它printf的原因:

printf("result: %d, %d\n", i, i*2); 
fflush(stdout);

我在看到nodejs脚本在关闭example.c时通过发送end\n获得了所有输出后尝试了这一点。

相关问题