Linux 读取函数实现

Linux read function implementation

我想知道 read() 函数在将套接字描述符传递给它时以及在将文件描述符传递给它时如何工作。对于文件描述符,它总是 returns n 指定的字节,如果没有 n 字节则更少。但是,如果是套接字描述符,则不需要 return n 字节。因此,为了确保我们是否收到了 n 字节,我们必须放置一个应用程序逻辑并记录我们收到了多少字节,并在计数为 [=] 时终止14=]n。我的问题是,为什么我们在读取文件时不必放入应用程序逻辑?

阅读 read(2) 手册页:

man 2 read

你最好假设它总是比你传递给它的整个缓冲区少 return 个字节数(特别是,因为可能很难知道文件描述符是否引用套接字,一个 tty,一些其他设备,一个管道,一个 fifo,或一些普通文件,也因为你可能有一些文件系统具有非 POSIX 兼容的语义)。您也可能已经到达文件末尾 (EOF) 等...

对于 TCP 套接字,请记住它们只是一个字节流,并且给定的单个发送可能会在多次读取中收到,等等......特别是,消息块可以 split/reassembled 通过“网络”(例如路由器)。

对于普通文件,请记住当您的进程正在读取它时,一些其他进程可能会更改它(例如写入它、截断它等等)。