关闭管道中未使用的一端

时间:2018-04-08 06:22:20

标签: c++ io operating-system pipe blocking

我正在阅读有关操作系统课程中的管道并编写一些代码以更好地理解它。我有一个疑问,请注意以下代码:

document.addEventListener('keydown', function(e){ 
// your code 
})

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

我怀疑是 即使我没有在读者进程中关闭写结束,它也会在编写进程结束时关闭。那么为什么仍然读取sys调用被阻止?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

两个问题:

首先,由于operator precedence,循环条件n_bytes=read(fd[0],&arr[i],sizeof(int))>0实际上是等于n_bytes = (read(fd[0],&arr[i],sizeof(int)) > 0)。也就是说,您将比较的值分配给变量n_bytes。要更正此操作,请在分配周围添加额外的括号,如(n_bytes=read(fd[0],&arr[i],sizeof(int)))>0

第二个问题是子进程的父都将在循环中调用wait。您应该只在父进程中执行此操作以等待子进程。