1

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

我遇到的问题是,尽管子进程的标准输出仍被定向到终端,但在给子进程标准输入提供了 print 'Hello World' 行之后,我什么也看不到。即使我 fflush() 管道,我也看不到任何输出。但是,如果我关闭管道的输入,那么终端上会出现“Hello World”。

子进程似乎只是缓冲 - 为什么会这样?我想最终将子进程标准输出重定向到另一个管道并从 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;   }
4

1 回答 1

2

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

有关更多信息,请参阅此论坛主题

于 2013-07-15T02:45:38.660 回答