【发布时间】:2023-03-31 04:12:01
【问题描述】:
我正在查看 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 包装器的,而不是实际的系统调用,但现在这并不重要。
【问题讨论】:
标签: linux unix system-calls