我试图了解管道.我有这个小程序,它使用管道从父进程发送消息到其子进程.子进程收到所有3条消息,但不是退出,在阅读最后一条消息后挂起.我做错了什么?谢谢.
PS:我注意到,如果我在父级的while循环中睡眠2秒钟,它就会工作。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(){
int desc[2];
pipe(desc);
int pid = fork();
if(pid == 0){
while(1){
sleep(1);
char buffer[16];
if(read(desc[0], buffer, 16) != 16){
printf("Error or finished");
exit(0);
};
printf("Child: message recieved - '%s'\n", buffer);
}
close(desc[1]);
}
if(pid > 0){
int i=0;
while(i <= 2){
char buffer[100];
i++; char x[10];
strcpy(buffer, "Hello, child!");
sprintf(x, " %d", i);
strcat(buffer, x);
if(write(desc[1], buffer, 16) != 16){
printf("Error");
exit(0);
};
}
close(desc[0]);
}
return 0;
}
字符串
2条答案
按热度按时间mxg2im7a1#
您忘记关闭父进程和子进程中管道的未使用端。实际上,您的子进程拥有管道的阅读和写入部分,因此它无法检测到文件结束,因为存在写入器(本身!),因此它在读取时被阻塞。将代码更改为:
字符串
请记住,在管道上,文件结束是“管道中没有更多的读取”和“没有更多的写入器”。
zazmityj2#
必须正确关闭管道末端。阅读器将挂起,直到管道的所有写入末端都关闭。
字符串