为什么在发送整数时在管道上使用 read 会挂起?

Why does using read on a pipe hang when sending integers?

我这辈子都弄不明白为什么这段代码会挂起。一切都在父进程上执行到 read(pipe[1], &recieve, sizeof(int));

#include <time.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>

pid_t fork(void);

int main(){
    pid_t main_pid = getpid();
    int fd[2];
    pid_t newproc = fork();
    pipe(fd);
    if (getpid() != main_pid){
        int send = 5;
        write(fd[1], &send, sizeof(int));
    }
    else{
        while (wait(NULL) > 0);
        int recieve;
        read(fd[0], &recieve, sizeof(int));
        printf("%d\n",recieve);
    }
    return 0;
}

您创建了两个管道。

child 写入它创建的管道。

parent 从它创建的完全不相关的管道中读取。

由于 parent 的管道从未写入任何内容,因此从中读取数据会阻塞。

调换 forkpipe 的顺序。

你写

    pid_t newproc = fork();
    pipe(fd);

如果您在 之后执行 pipe() 调用 fork(),您最终会在 parent 和 [=21= 上拥有两个完全不同的管道](并且彼此无关)。管道调用必须在 fork 之前完成,因此 两个进程引用同一个管道。 按照上面的方式,parent 都无法访问这两个描述符child 已获取,child 也无法访问 parent。