gpt4 book ai didi

C 从命名管道读取不会结束

转载 作者:太空狗 更新时间:2023-10-29 16:06:06 24 4
gpt4 key购买 nike

在 child 中,我写到 fifo“sample”并在 parent 中读取它。在下面的代码中,parent 写入终端“sample”并等待,它不会退出 read 函数。

pid_t p;
int fd;
char str[]="sample";
char ch;

mkfifo("myfifo", FIFO_PERMS);
fd = open("myfifo", O_RDWR);
p=fork();

if(!p){

printf("write %d byte\n", write(fd, str, 6));
}
else{

wait(NULL);
while(read(fd, &ch, 1)>0)

write(STDOUT_FILENO, &ch, 1);

close(fd);

unlink("myfifo");
}

最佳答案

情况是这样的,因为文件描述符仍处于写入状态,因为您使用 O_RDWR 打开它并与两个进程共享。您必须确保文件描述符仅在读取过程中打开以供读取,例如:

pid_t p;
char str[]="sample";
char ch;

mkfifo("myfifo", FIFO_PERMS);
p=fork();

if(!p){
int fd = open("myfifo", O_WRONLY);

printf("write %d byte\n", write(fd, str, 6));
}
else{
int fd = open("myfifo", O_RDONLY);

wait(NULL);
while(read(fd, &ch, 1)>0)

write(STDOUT_FILENO, &ch, 1);

close(fd);

unlink("myfifo");
}

原因:管道上的 read() 只在最后一个为写入打开的文件描述符关闭时返回 EOF,而当您从中读取的文件描述符也为写入打开时,情况永远不会如此(O_RDWR)

关于C 从命名管道读取不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36473341/

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