【问题标题】:Piping from parent process to child and back从父进程到子进程并返回
【发布时间】:2018-04-05 11:00:48
【问题描述】:

我发现了很多与此类似的问题(例如https://www.quora.com/How-can-I-write-a-code-for-PIPE-in-C-shell-script-python),它们适用于这些问题所描述的情况,但由于某种原因不适用于我的情况。到目前为止,我找到的答案涉及从一个孩子到另一个孩子的管道输出(前面提到的带括号的链接)或从孩子到父母/父母到孩子的管道输出。我想要做的是让父母能够写入孩子的标准输入并从它的标准输出中读取。或者,在更一般的情况下,给定一些子节点,让父节点写入第一个子节点的 STDIN,后者会将其输出通过管道传输到第二个子节点,第二个子节点会将其输出通过管道传输到第三个子节点,依此类推,直到最后一个子节点child 通过管道将其输出返回给 parent。也就是说,我希望能够从 C/C++ 代码中执行类似 prog0 | prog1 | prog 2 | ... 的操作。我当前的一半尝试(一半是因为我只是尝试从echo 的STDOUT 中读取,然后再尝试使用cat - 之类的简单方法进行完整的输入/输出尝试)看起来像这样(为简洁起见,省略了一些错误检查):

void test() {
    int pipe_fds[2];
    pid_t cpid, wpid;
    int status;
    char buf[16] = {0};

    status = pipe(pipe_fds);
    cpid = fork();
    if (cpid == 0) {
        dup2(pipe_fds[1], STDOUT_FILENO);
        close(pipe_fds[0]);
        execlp("echo", "Hello world!", NULL);
        printf("Child returned abnormally: %d\n", errno);
        _exit(3);
    }

    close(pipe_fds[1]);
    wpid = waitpid(cpid, &status, 0);
    printf("Waited on pid %d, which exited with %d\n", wpid, WEXITSTATUS(status));
    read(pipe_fds[0], buf, 16);
    printf("Child said: %s\n", buf);
    close(pipe_fds[0]);

    exit(0);
}

这会运行,但父级没有从子级获得可见的输出。我将如何解决这个问题,更重要的是,我将如何处理我之前提到的一系列流程的管道往来?

【问题讨论】:

  • 没有“C/C++”语言,我在这里看不到任何与 C++ 相关的内容 -> 标记已删除。
  • 管道是单向的。如果要双向通信,则需要 2 个管道。
  • 哦等等,nullptr 是 C++。将其更改为0NULL(我建议,此代码实际上只是C)- 或将标签更改 为C++。不要同时标记两者。
  • 顺便说一句,我发现int pipes[2]; 非常具有误导性。一根管子有两端,所以这应该是例如int pipefds[2];。如果你想要两个管道,你可以使用int pipes[2][2];
  • 已修复。抱歉,它的 C++ 部分是因为程序的其余部分(未显示)是 C++。

标签: c unix pipe fork


【解决方案1】:

在这种情况下,问题在于您调用 execlp。试试

execlp("echo", "echo", "Hello world!", NULL); 

【讨论】:

  • echo重复是什么原因?我记得在其他地方看到过这种情况,但为什么会出现这种情况?
  • 这就是它的工作原理。如果你写execlp("echo", "Hello world!", NULL),那么可执行文件/bin/echo(假设路径是这样解析它的)将被调用,并将argv[0]设置为“Hello world!”并且 argv[1] 设置为 NULL。如此有效地调用 echo 没有参数。作为练习,尝试调用execlp("sleep", "hello world", "500", NULL) 并检查进程表(例如,ps 的输出)
  • 啊,我现在明白了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2023-03-24
  • 2017-08-09
相关资源
最近更新 更多