我正在尝试创建一个非常简单的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:也许使用sockets或其他东西来与example通信会更好,但这只是对一个实际项目的测试,在这个项目中,我将使用另一个我无法更改的C程序。

最佳答案

需要fflush(stdout)的原因是,因为stdio检测到您没有在终端中运行,所以它默认不会在'\n'上刷新,以提高数据吞吐量。
所以可以显式刷新,或者只需使用

setvbuf(stdout, NULL, _IOLBF, 0);

阅读this man page了解更多信息。

关于c - 无法从子进程的标准输出中获取任何东西,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22273865/

10-12 12:54