当前位置: 首页 > 知识库问答 >
问题:

管道没有被子进程读取?

潘哲
2023-03-14

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

我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了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个答案

袁俊弼
2023-03-14

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

有关更多信息,请参阅此论坛帖子。

 类似资料:
  • Process 结构体代表了一个正在运行的子进程,并公开了stdin(标准输入),stdout(标准输出) 和 stderr(标准错误) 句柄,通过管道和底层的进程交互。(原文:The Process struct represents a running child process, and exposes the stdin, stdout and stderr handles for int

  • 问题内容: 我正在尝试使用Ruffus管道中的多个Sailq文件作为参数的Sailfish。我使用python中的子流程模块执行Sailfish,但即使设置,在子流程调用中也不起作用。 这是我要使用python执行的命令: 或(最好): 概括: 我将如何在python中执行此操作?子过程正确吗? 问题答案: 模拟bash进程替换: 在Python中,您可以使用命名管道: 在哪里: 实现bash进程

  • 问题内容: 我想在以下行上使用子流程: 我发现感谢子帖子的子流程文档,但是在示例中,我们仅使用了两次管道。 因此,我尝试了三个命令中的两个,它可以正常工作 您能帮我执行第三条命令吗? 非常感谢你。 问题答案: 只需按照相同的示例添加第三个命令:

  • 问题内容: 我正在用Go编写程序,该程序执行类似程序的服务器(也就是Go)。现在,我想在启动父程序的终端窗口中获​​得子程序的标准输出。一种方法是使用函数,但这仅在进程退出后才输出标准输出。(这是一个问题,因为这个类似于服务器的程序运行了很长时间,并且我想读取日志输出) 变量是,我不知道该如何使用它来完成任务,因此我在网络上找不到有关此主题的任何有用信息。 对代码的解释:取消注释该函数以获取要编译

  • 问题内容: 感谢以下有用的建议: 所以当我似乎固定 将命令分成对Popen的单独调用 stderr = subprocess.PIPE作为每个Popen链的参数。 新代码: 原始帖子: 我花了很长时间尝试解决通过简单的subprocess.Popen传递问题。 码: 输出文件的长度约为1000行: 文件长度大于241行的输出: 文件长度小于241行的输出很好。 我一直在疯狂地阅读文档并进行谷歌搜索

  • 我已经在Jenkins上创建了一个基本的声明性管道。当我运行构建时,它会抛出以下错误 Jenkins服务器使用最新版本的默认插件设置为默认。Jenkinsfile如下所示 当Jenkins读取Jenkinsfile时,看起来块失败了,这在Jenkinsfile看起来很混乱。