C 子进程未读取管道?

C 子进程未读取管道?,c,linux,node.js,process,pipe,C,Linux,Node.js,Process,Pipe,我想将node.js作为子流程运行,并将其输入。使用C,下面是我的一些示例代码 我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上 子流程似乎只是缓冲-为什么? 我希望最终将子流程stdout重定向到另一个管道并读取它 从main()导入 int main(int argc,char*ar

我想将node.js作为子流程运行,并将其输入。使用C,下面是我的一些示例代码

我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上

子流程似乎只是缓冲-为什么? 我希望最终将子流程stdout重定向到另一个管道并读取它 从main()导入

int main(int argc,char*argv[]){


正在读取的管道没有问题。问题是
/usr/bin/node
只调用REPL(read-eval-print循环),默认情况下,如果它检测到
stdin
是交互式的。如果您有足够新版本的
nodejs
,则可以提供
-i
--interactive
命令行标志,但这将不仅仅是在读取每一行时执行它;它实际上还将充当控制台,包括插入将SI颜色序列输入输出并打印每个表达式的值

有关更多信息,请参阅此部分。

虽然提到Python,但这是相同的基本问题。您必须以某种方式说服其他程序减少缓冲。(我不知道是否可以让node.js这样做,或者是否需要使用伪TTY。)
  int toNode[2];

  pipe(toNode);

  pid_t child_pid = fork();
  if (child_pid == 0) { // child

      // close write end
      close(toNode[1]);
      // connect read end to stdin
      dup2(toNode[0], STDIN_FILENO);


      // run node executable
      char* arg_list[] = { "/usr/bin/node", NULL};
      execvp(arg_list[0], arg_list);

      fprintf(stderr, "process failed to start: %s\n", strerror(errno));
      abort();
   }
   else { // parent

      FILE* stream;

      // close read end
      close(toNode[0]);

      // convert write fd to FILE object
      stream = fdopen(toNode[1], "w");

      fprintf(stream, "console.log('Hello World');\n");
      fflush(stream);

      //close(toNode[1]);


      waitpid(child_pid, NULL, 0);

   }

return 0;   }