[英]Under what circumstances does the read() syscall return 0?
我正在查看 Unix 中的read
系统调用,它(至少在 Linux 中)具有以下签名:[1]
ssize_t read(int fd, void* buf, size_t count);
让我们假设调用成功(即没有负返回值)并且count > 0
(即缓冲区实际上可以存储非零字节数)。 在什么情况下read()
返回 0? 我可以想到以下几点:
fd
引用常规文件并且已到达文件末尾时。fd
指的是管道、套接字或 FIFO 的接收端时,发送端已经关闭并且管道/套接字/FIFO 自己的缓冲区已经耗尽。fd
指的是ICANON
中的终端设备的从端并且Ctrl-D
已发送到主端时,而行缓冲区为空。 我很好奇是否还有其他我不知道的情况,其中read()
将返回 0 结果。我对上面列表中的最后一种情况特别感兴趣(由于原因) ,其中read()
返回 0 一次,但随后在同一 FD 上调用read()
可能返回非零结果。 如果答案仅适用于某种风格的 Unix,我仍然有兴趣听到它。
[1] 我知道这个签名是用于 libc 包装器的,而不是实际的系统调用,但这现在并不重要。
通常返回值0
总是意味着文件结束。 但是,如果您指定0
作为要读取的字节数,除非检测到错误,否则它将始终返回0
。
终端设备是一个特例。 如果终端处于熟模式,输入Control-d 会告诉设备驱动程序立即从任何挂起的read()
返回输入编辑缓冲区中的任何内容,而不是等待用户输入换行符。 如果缓冲区为空,则会导致读取长度为零。 这就是在行首输入 EOF 字符被应用程序自动视为 EOF 的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.