为什么在发送整数时在管道上使用 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 的管道从未写入任何内容,因此从中读取数据会阻塞。
调换 fork
和 pipe
的顺序。
你写
pid_t newproc = fork();
pipe(fd);
如果您在 之后执行 pipe()
调用 fork()
,您最终会在 parent 和 [=21= 上拥有两个完全不同的管道](并且彼此无关)。管道调用必须在 fork 之前完成,因此 两个进程引用同一个管道。 按照上面的方式,parent 都无法访问这两个描述符child 已获取,child 也无法访问 parent。
我这辈子都弄不明白为什么这段代码会挂起。一切都在父进程上执行到 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 的管道从未写入任何内容,因此从中读取数据会阻塞。
调换 fork
和 pipe
的顺序。
你写
pid_t newproc = fork();
pipe(fd);
如果您在 之后执行 pipe()
调用 fork()
,您最终会在 parent 和 [=21= 上拥有两个完全不同的管道](并且彼此无关)。管道调用必须在 fork 之前完成,因此 两个进程引用同一个管道。 按照上面的方式,parent 都无法访问这两个描述符child 已获取,child 也无法访问 parent。