如何从Node.js发送到C程序的stdin并从stdout接收?

如何从Node.js发送到C程序的stdin并从stdout接收?,c,node.js,pipe,stdout,stdin,C,Node.js,Pipe,Stdout,Stdin,我和一位同事需要连接他的C程序和我的Node.js脚本。我正试图证明使用stdio在两者之间传递消息的概念,到目前为止,这个概念还没有被证明!节点脚本在初始化时将可执行文件作为子进程启动,但随后无法发送或接收数据 我已经编写了一个非常简单的C程序,它在stdin上接收到的任何内容都会回显到stdout。我不是C程序员,所以希望我没有在16行中做过太令人震惊的事情:p: 流_echo.c: 当我运行此脚本时,会多次尝试将数据发送到子进程,并且不会报告任何错误,尽管进程的connected属性为fa

我和一位同事需要连接他的C程序和我的Node.js脚本。我正试图证明使用stdio在两者之间传递消息的概念,到目前为止,这个概念还没有被证明!节点脚本在初始化时将可执行文件作为子进程启动,但随后无法发送或接收数据

我已经编写了一个非常简单的C程序,它在stdin上接收到的任何内容都会回显到stdout。我不是C程序员,所以希望我没有在16行中做过太令人震惊的事情:p:

流_echo.c:

当我运行此脚本时,会多次尝试将数据发送到子进程,并且不会报告任何错误,尽管进程的connected属性为false,但也不会收到任何消息。当我终止子进程时,将触发流关闭事件和进程关闭事件,脚本将正常终止

我不明白为什么connected是false,但是close事件会触发。我觉得这是一条主要线索

有人能告诉我,在互联网上拖网多少小时是不可能的吗?

当标准输出未连接到终端时,它是块缓冲的。这意味着在缓冲区填满或应用程序终止之前,不会刷新输出


在您的C应用程序中,在fprintf之后添加fflushstdout。

谢谢!这似乎是问题的十分之九。我不知道它在终端上的行为会有所不同,我确信问题出在我的节点脚本中。我找错地方了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER_SIZE 255

int main(void) {

    char * buffer = calloc(BUFFER_SIZE, 1);

    while(fgets(buffer, BUFFER_SIZE, stdin) != NULL) {

        //Echo back on stdout:
        fprintf(stdout, "echo: %s", buffer);
    }
}
(function() {
    "use strict";

    var jcp = require("child_process").spawn("./stream_echo", [], {
            detached: false,
            stdio: "pipe"
        }),

        counter = 0,

        timer,

        sendData = function() {
            console.log("In sendData. Connected: " + jcp.connected);

            counter += 1;
            jcp.stdin.write("This is data " + counter + "\r\n");

            timer = setTimeout(sendData, 2000);
        };


    //******** STDIN ********
    jcp.stdin.on("close", (data) => {
        console.log("stdin closed.");
        if (timer) {
            clearTimeout(timer);
        }
    });


    //******** STDOUT ********
    jcp.stdout.on("data", (data) => {
        console.log("stdout: " + data);
    });

    jcp.stdout.on("close", (data) => {
        console.log("stdout closed.");
    });


    //******** STDERR ********
    jcp.stderr.on("data", (data) => {
        console.log("stderr: " + data);
    });

    jcp.stderr.on("close", (data) => {
        console.log("stderr closed.");
    });


    //******** PROCESS ********
    jcp.on("close", (code, signal) => {
        console.log("Child process closed.\nCode: " + code + "\nSignal: " + signal);
    });

    jcp.on("exit", (code, signal) => {
        console.log("Child process exited.\nCode: " + code + "\nSignal: " + signal);
    });

    jcp.on("disconnect", () => {
        console.log("Child process disconnected.");
    });

    console.log("jcp.pid: " + jcp.pid);
    console.log("Connected: " + jcp.connected);
    console.log("Calling sendData for the first time....");
    sendData();

}());