提问人:Joseph Sible-Reinstate Monica 提问时间:5/27/2022 更新时间:5/27/2022 访问量:280
在先前的 EOF 之后,从管道读取是否会产生更多数据?
Will reading from a pipe ever produce more data after a prior EOF?
问:
如果你从一个常规文件ing,它返回0,因为你得到了EOF,但随后其他人将一些东西附加到文件中,随后的系统调用将为你提供新数据。同样,如果您来自 TTY,并且它返回 0,因为用户按了 Ctrl+D,但随后用户键入了更多文本,则后续系统调用将为您提供新数据。但是,如果你是从管道里出来的呢?有没有可能一个系统调用可以返回 0,然后一个系统调用会从管道中获取更多数据?read
read
read
read
read
read
答:
是的。 在同一 FD 上,如果某些东西重新打开管道进行写入,FD 将再次开始返回数据。read
您可以轻松地重新打开命名管道,而 Linux 允许您通过写入 来重新打开匿名管道。特别是,即使 FD 仅在您从中获取它的过程中打开以供读取,您也可以打开此文件进行写入。/proc/<pid>/fd/<fd>
评论
如果尝试读取内部未命名管道,并且没有数据,则读取器将默认停止。
如果写入器关闭管道,则读取器将返回任何数据,但现在管道已关闭。没有人会写。如果编写器复制,则读取器将停止,直到关闭所有编写器(默认情况下)。
您可以通过 fcntl F_SETFL 将管道模式设置为 O_NONBLOCK,但如果当前没有可用的内容,则调用它将返回失败代码 EAGAIN 或 EWOULDBLOCK(在我的 linux 上相同?
如果管道实际上是一个命名的管道 = fifo,即作为先前使用 mkfifo() 创建的常规路径文件打开,那么读取器再次阻止或返回 EAGAIN。如果没有编写器,或者编写器只是不输出,它将被阻止。
请注意,如果有 /no/ 编写器,只需打开()ing fifo 进行读取就会被阻止,直到有编写器,即使没有写入内容。在内部,记录在至少 1 个读取器和 1 个写入器(或O_NONBLOCK)之前不会创建管道。但是用O_NONBLOCK打开 fifo 阅读总是成功的,所以你不知道是否有任何作家。
因此,对于FIFO读者来说,没有简单的记录方法来知道是否没有编写器。您也许可以在停止的块打开以供读取时发出信号?
我不确定如果文件被取消链接(删除)并且没有编写器会发生什么。也许这会触发 EOF?或者,也许您的代码将永远等待,因为现在无法添加更多编写器?
评论