了解读取系统调用

Understanding read syscall

我正在阅读 man read 手册页,发现可以读取少于作为参数传入的所需字节数:

It is not an error if this number is smaller than the number of bytes requested; this may happen for example because fewer bytes are actually available right now (maybe because we were close to end-of-file, or because we are reading from a pipe, or from a termi‐nal), or because read() was interrupted by a signal.

我有以下情况:

  1. 某些进程将文件移动到我正在监听的目录中 IN_MOVED_TO inotify 事件。
  2. 我收到一个 IN_MOVED_TO 事件,打开一个文件并开始读取它直到到达 EOF
  3. 没有其他进程修改移动到1.的文件(移动后一直保持不变)

是否保证如果 read return 读取的字节数少于我请求的字节数,那么下一次调用 read 将 return 0?我的意思是像 'reading 1 000 000 000 by a single bytes for a gigabyte file' 这样的情况被文档禁止

Is it guaranteed that if read returns the number of bytes read less then I requested then the next call to read will return 0?

不,实际上没有。如果文件系统完全 POSIX 兼容,那应该是正确的,但其中许多不兼容(在极端情况下)。特别是 NFS(参见 nfs(5)) and FUSE or proc (see proc(5))不完全 POSIX 兼容。

所以在实践中我强烈建议处理“read returns 比想要的情况更少的字节数”,即使你认为它不应该发生是正确的。处理那个 "impossible" 案例对你来说应该很容易。

另请注意,inotify(7) 设施不适用于 NFS、proc、FUSE 等奇怪的文件系统,...还要考虑极端情况,例如,在 Ext4 文件系统中,指向 NFS 文件的符号链接,;或绑定坐骑等...