了解读取的系统调用

时间:2018-10-05 04:18:08

标签: c linux system-calls

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

  

如果此数字小于字节数,则不是错误   要求;例如,这可能是因为较少的字节   现在可以实际使用(也许是因为我们离   文件结尾,或者因为我们正在从管道读取,或者从   终端),或者因为read()被信号中断。

我有以下情况:

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

是否可以保证,如果read返回的字节数少于我请求的字节数,则对read的下一次调用将返回0?我的意思是说文档禁止类似“用1字节读取1亿字节的文件”这样的情况

1 个答案:

答案 0 :(得分:1)

  

是否可以确保如果read返回的字节数少于我请求的字节数,则下一个read调用将返回0?

不,实际上没有。如果文件系统完全符合POSIX,但其中许多不兼容(在极端情况下),则应为true。特别是NFS(请参阅nfs(5)FUSE或proc(请参阅proc(5))并不完全符合POSIX。

因此,在实践中,我强烈建议处理“ read返回的字节数少于所需的情况”,即使您正确地相信不应发生这种情况也是如此。处理“不可能”的情况对您来说应该很容易。

还请注意,inotify(7)工具不适用于NFS,proc,FUSE等离奇的文件系统……还要考虑一下在Ext4文件系统内部与NFS文件的符号链接等极端情况;或绑定坐骑等...