从父进程到子进程和后退

时间:2017-10-24 15:08:57

标签: c unix pipe fork

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

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

这会运行,但父级没有来自子级的可见输出。我将如何解决这个问题,更重要的是,如何像我之前提到的那样,从一系列流程中加入管道?

1 个答案:

答案 0 :(得分:0)

在这种情况下,问题是你调用execlp。尝试

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