gpt4 book ai didi

c++ - 关闭管道中未使用的末端

转载 作者:行者123 更新时间:2023-11-30 05:02:43 25 4
gpt4 key购买 nike

我在操作系统类(class)中阅读了有关管道的内容,并编写了一些代码以更好地理解它。我对以下代码有疑问:

int fd[2];              // CREATING PIPE
pipe(fd);
int status;

int pid=fork();
if(pid==0)
{
// WRITER PROCESS

srand(123);
int arr[3]={1,2,3};

close(fd[0]); // CLOSE UNUSED(READING END)
for(int i=0;i<3;i++)
write(fd[1],&arr[i],sizeof(int));
close(fd[1]); // CLOSE WRITING END AFTER WRITING SO AS READ GETS THE EOF
}
else
{
// READER PROCESS

int arr[10];

int i=0;
int n_bytes;
//close(fd[1]); // CLOSE UNUSED(WRITING END)
while((n_bytes=read(fd[0],&arr[i],sizeof(int)))>0) // READIN IN A LOOP UNTIL END
i++;
close(fd[0]); // CLOSE READING END after reading
for(int j=0;j<i;j++)
cout<<arr[j]<<endl;
while(wait(&status)>0)
;
}

如果我运行它,读取将被阻止,如果我取消注释读取器进程中的 close(fd[1]) 命令,代码运行正常。这意味着 close(fd[1]) 关闭写入端并且读取可以继续。

我的疑问是即使我不关闭读取器进程中的写入端,它也会在写入器进程结束时关闭。那么为什么读取系统调用仍然被阻止?

最佳答案

最初,两个进程在管道的读写端都有打开的文件描述符。

只有当所有打开的文件描述符都关闭时,操作系统才会关闭管道的一端,所以如果你不在子进程中调用 close(fd[1])文件描述符将保持打开状态,管道的写入端不会关闭,read 将阻塞等待永远不会到来的输入。

关于c++ - 关闭管道中未使用的末端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49715075/

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