在先前的 EOF 之后,从管道读取是否会产生更多数据?
Will reading from a pipe ever produce more data after a prior EOF?
如果您 read
从一个常规文件中读取,并且它 return 是 0 因为您到达了 EOF,但随后其他人向该文件附加了一些内容,随后的 read
系统调用将为您提供新数据。同样,如果您从 TTY read
ing,并且它 returns 0 因为用户按下 Ctrl+D,但随后用户键入了更多文本,随后的 read
系统调用会给你新的数据。但是,如果您 read
从管道中抽取怎么办?是否有可能一个 read
系统调用可以 return 0,而后一个系统调用会从管道中获取更多数据?
是的。 read
如果某些东西重新打开管道进行写入,同一个 FD 将再次开始返回数据。
您可以轻松地重新打开命名管道,并且 Linux 允许您通过写入 /proc/<pid>/fd/<fd>
来重新打开匿名管道。特别是,您可以打开此文件进行写入,即使 FD 仅在您从中获取它的过程中以读取方式打开。
如果您尝试读取内部 unnamed-pipe 并且没有数据,则 reader 将默认停止。
如果作者关闭管道,那么 reader 将 return 没有数据,但现在管道已关闭。没有人可以写。如果 writer 重复,reader 将停止,直到所有 writer 都关闭(默认)。
您可以通过 fcntl F_SETFL 将管道模式设置为 O_NONBLOCK,但随后将此 return 称为失败代码 EAGAIN 或 EWOULDBLOCK(与我的 linux 相同?) 如果当前没有可用的内容。
如果管道实际上是 named-pipe = fifo,即作为先前使用 mkfifo() 创建的常规路径文件打开,那么 reader 只是块或 return 再一次。如果没有作者,或者作者只是不输出,它将阻塞。
请注意,如果没有/写入者,即使没有写入内容,只要打开()ing fifo 进行读取就会阻塞,直到有写入者为止。在内部,记录在至少有 1 个 reader 和 1 个写入器(或 O_NONBLOCK)之前不会创建管道。但是用O_NONBLOCK打开fifo read总是成功,所以不知道有没有writer。
所以没有简单的记录方式让 fifo reader 知道是否没有写入器。您或许可以在停滞的阻塞处发出信号 open-for-read?
我不确定如果文件被取消链接(删除)并且没有作者会发生什么。也许这会触发 EOF?或者您的代码可能会永远等待,因为现在无法添加更多编写器?
如果您 read
从一个常规文件中读取,并且它 return 是 0 因为您到达了 EOF,但随后其他人向该文件附加了一些内容,随后的 read
系统调用将为您提供新数据。同样,如果您从 TTY read
ing,并且它 returns 0 因为用户按下 Ctrl+D,但随后用户键入了更多文本,随后的 read
系统调用会给你新的数据。但是,如果您 read
从管道中抽取怎么办?是否有可能一个 read
系统调用可以 return 0,而后一个系统调用会从管道中获取更多数据?
是的。 read
如果某些东西重新打开管道进行写入,同一个 FD 将再次开始返回数据。
您可以轻松地重新打开命名管道,并且 Linux 允许您通过写入 /proc/<pid>/fd/<fd>
来重新打开匿名管道。特别是,您可以打开此文件进行写入,即使 FD 仅在您从中获取它的过程中以读取方式打开。
如果您尝试读取内部 unnamed-pipe 并且没有数据,则 reader 将默认停止。
如果作者关闭管道,那么 reader 将 return 没有数据,但现在管道已关闭。没有人可以写。如果 writer 重复,reader 将停止,直到所有 writer 都关闭(默认)。
您可以通过 fcntl F_SETFL 将管道模式设置为 O_NONBLOCK,但随后将此 return 称为失败代码 EAGAIN 或 EWOULDBLOCK(与我的 linux 相同?) 如果当前没有可用的内容。
如果管道实际上是 named-pipe = fifo,即作为先前使用 mkfifo() 创建的常规路径文件打开,那么 reader 只是块或 return 再一次。如果没有作者,或者作者只是不输出,它将阻塞。
请注意,如果没有/写入者,即使没有写入内容,只要打开()ing fifo 进行读取就会阻塞,直到有写入者为止。在内部,记录在至少有 1 个 reader 和 1 个写入器(或 O_NONBLOCK)之前不会创建管道。但是用O_NONBLOCK打开fifo read总是成功,所以不知道有没有writer。
所以没有简单的记录方式让 fifo reader 知道是否没有写入器。您或许可以在停滞的阻塞处发出信号 open-for-read?
我不确定如果文件被取消链接(删除)并且没有作者会发生什么。也许这会触发 EOF?或者您的代码可能会永远等待,因为现在无法添加更多编写器?