【发布时间】:2018-09-17 19:08:10
【问题描述】:
我在操作系统课程中阅读了有关管道的内容,并编写了一些代码以更好地理解它。我对以下代码有疑问:
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]) 关闭写入端并且可以继续读取。
我的疑问是,即使我没有在读取器进程中关闭写入端,它也会在写入器进程结束时关闭。那么为什么 read sys 调用仍然被阻塞?
【问题讨论】:
标签: c++ io operating-system pipe blocking