管道没有被子进程读取?

时间:2013-07-15 01:16:09

标签: c linux node.js process pipe

我想将node.js作为子进程运行并提供输入。使用C,这是我的一些示例代码。

我遇到的问题是虽然子进程的stdout仍然指向终端,但是在向子进程stdin提供了一个打印'Hello World'行之后我什么也看不到。即使我fflush()管道,我在输出上看不到任何东西。但是,如果我关闭管道的输入,那么终端上会出现“Hello World”。

子进程似乎只是缓冲 - 为什么呢? 我想最终将子进程stdout重定向到另一个管道并读取它 来自main()。

  

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

  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;   }

1 个答案:

答案 0 :(得分:2)

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

有关详细信息,请参阅此forum thread