gpt4 book ai didi

c - 从管道读取后程序不会停止

转载 作者:行者123 更新时间:2023-12-02 08:15:55 25 4
gpt4 key购买 nike

我正在尝试理解管道。我有这个小程序,它使用管道将消息从父进程发送到其子进程。 child 收到了所有 3 条消息,但在阅读了最后一条消息后,它没有退出,而是挂起。我究竟做错了什么?谢谢。

PS:我注意到如果我在父级的 while 循环中 sleep 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;
}

最佳答案

您忘记关闭父子节点中无用的管道末端。实际上,您的 child 拥有管道的读写部分,因此他无法检测到文件结尾,因为存在写入器(本身!),因此它在读取中被阻止。将您的代码更改为:

if(pid == 0){
close(desc[1]); // Child is not a writer, so close the write part immediately!
while(1){
...
}
}
if(pid > 0){
close(desc[0]); // Parent is not a reader, so close the read part immediately!
int i=0;
while(i <= 2){
...
}
}

请记住,在管道上,文件结尾是“管道中没有更多可读取的内容”“没有更多的写入器”。

关于c - 从管道读取后程序不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com