C中的单向管道

Unidirectional pipes in C

我在尝试找出如何为 parent 进程和 child 进程制作单独的管道以单向方式运行时遇到问题。即:parent 的描述符及其 child 的不同描述符。

这是我拥有的:

#include <sys/types.h>

int main(int argc, char *argv[]) {

    int parent[2];
    int child[2];
    pid_t pid;

    int num = 0;

    pipe(parent);
    pipe(child);

    pid =fork();

    if(pid > 0){ // do parent stuff

        num = 5;

        write(parent[1], &num, sizeof(num));
        printf("Parent with pid %d sent value: %d\n", getpid(), num);

        close(parent[1]);

    }else{ // do child stuff

        read(child[0], &num, sizeof(num));
        printf("Child with pid %d received value: %d\n", getpid(), num);

        close(child[0]);

        exit(0);
    }
    return 0;
}

输出:

Parent with pid 31702 sent value: 5

我知道我应该在 read()write() 命令之前的某个时间点关闭一些描述符,但似乎无论我关闭什么 child 响应在 parent 可以 write() 之前打印,否则我最终会得到一个破损的管道。我应该在哪里关闭描述符以成功地单向使用这些管道?

简而言之,这不是您使用管道的方式。

管道有 read 0write 1 端。

在你的例子中,child 正在从 child[0] 读取,但没有人会通过 child[1] 写入 child。 parent 将写入 parent[1]

尝试使用单个管道(将 child[0] 更改为 parent[0])。并确保删除在相应流程中不会使用的末端

您制作了两根管子,然后只使用了每根管子的一端;通信不起作用,因为没有人注意任何一个的 other 端。 parentchild 是完全独立的管道,你在一个管道上发送的内容不会出现在另一个管道上。你只需要一根管子:

int main(int argc, char *argv[]) {

    int pipefd[2];
    pid_t pid;

    int num = 0;

    pipe(pipefd);

    pid = fork();

    if(pid > 0){ // do parent stuff
        close(pipefd[0]); // close the reading end

        num = 5;

        write(pipefd[1], &num, sizeof(num)); // write on the writing end
        printf("Parent with pid %d sent value: %d\n", getpid(), num);

    }else{ // do child stuff
        close(pipefd[1]); // close the writing end

        read(pipefd[0], &num, sizeof(num)); // read on the reading end
        printf("Child with pid %d received value: %d\n", getpid(), num);

        exit(0);
    }
    return 0;
}

管道已经是单向的,它给你两个端点:写入端和读取端。你只需要适当地使用每一个。