首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的叉管

c++中的叉管
EN

Stack Overflow用户
提问于 2021-03-20 04:21:56
回答 1查看 113关注 0票数 0

我使用4个进程,其中A的输出将转到A1,A1的输出将转到A2,A2的输出将在控制台中显示。就连A1的输出也会出现在控制台上。

  1. 1程序是一个随机生成器,它将根据A1输入的要求生成输出,并从
  2. 第二程序的子进程中充当stdout的收集器-- Python脚本将接受A的输出并根据A2的要求生成输出,A1的输出应在控制台中打印。
  3. 第3程序- cpp文件将接受A1输出的输入,并在控件中给出输出和打印。

我使用两个管道- ABtoC表示A到A1,A1toA2表示A1toA2。

这里A到A1正在工作,A1的输出在控制台中打印。但问题是A1的输出不会流向A2的输入。下面是我在这个操作中使用的代码。

代码语言:javascript
复制
#include <vector>

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <string>
#include <sstream>

/// Entry point of process B
int procB(void) {
  // Process B writing to C
  while (!std::cin.eof()) {
    // read a line of input until EOL and store in a string
    std::string line;
    std::getline(std::cin, line);
    if (line.size() > 0)
      std::cout << line << std::endl;
  }
  std::cout << std::endl;
  return 0;
}

int main(int argc, char** argv) {
  std::vector<pid_t> kids;
  // create a pipe
  int ABtoC[2];
  pipe(ABtoC);

  int A1toA2[2];
  pipe(A1toA2);



  pid_t child_pid;
  child_pid = fork();
  if (child_pid == 0) {
    // redirect stdout to the pipe
    dup2(ABtoC[1], STDOUT_FILENO);
    close(ABtoC[0]);
    close(ABtoC[1]);
    close(A1toA2[0]);
    close(A1toA2[1]); // Close this too!

    execv("./rgen", argv);
  } else if (child_pid < 0) {
    std::cerr << "Error: could not fork\n";
    return 1;
  }


  kids.push_back(child_pid);

  child_pid = fork();
  if (child_pid == 0) {
    // redirect stdin from the pipe
    dup2(ABtoC[0], STDIN_FILENO);
    close(ABtoC[1]);
    close(ABtoC[0]);
    close(A1toA2[0]);
    close(A1toA2[1]);

    argv[0] = (char *)"python3";
      argv[1] = (char *)"a1ece650.py";
      argv[2] = nullptr;


    dup2(A1toA2[1], STDOUT_FILENO);
    close(A1toA2[1]);
    close(A1toA2[0]);
    close(ABtoC[0]);
    close(ABtoC[1]);
    execvp("python3", argv);

  } else if (child_pid < 0) {
    std::cerr << "Error: could not fork\n";
    return 1;
  }

kids.push_back(child_pid);

  child_pid = fork();
  if (child_pid == 0) {
    // redirect stdin from the pipe
    dup2(A1toA2[0], STDIN_FILENO);
    close(A1toA2[1]);
    close(A1toA2[0]);
    close(ABtoC[0]);
    close(ABtoC[1]);

    execv("./ece650-a2", argv);

  } else if (child_pid < 0) {
    std::cerr << "Error: could not fork\n";
    return 1;
  }


  kids.push_back(child_pid);
  child_pid = 0;

  // redirect stdout to the pipe
  dup2(A1toA2[1], STDOUT_FILENO);
  close(A1toA2[0]);
  close(A1toA2[1]);
  close(ABtoC[0]);
  close(ABtoC[1]);

  // start process B
  int res = procB();

  // send kill signal to all children
  for (pid_t k : kids) {
    int status;
    kill(k, SIGTERM);
    waitpid(k, &status, 0);
  }

  return res;
}

插入ASCII图形如下:

代码语言:javascript
复制
+--------------+   +-----+             +-----+                +-----+
|Fork and Pipe| --  A.cpp stdout--stdin A1.py --stdout--stdin  A2.cpp
+--------------+.  +-----+             +-----+                +-----+
```                                       |                      |
代码语言:javascript
复制
                                      V                      V
代码语言:javascript
复制
                                    stdout                  stdout
代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-20 04:34:57

当您启动A1时,您将关闭A1toA2[1],然后尝试将其放入stdout。首先完成所有的dup,然后关闭您不需要的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66718213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档