c - read() 和 fread() return 值

c - read() and fread() return values

SO的好人!

我有一个理论问题。 在 read() 联机帮助页中,我阅读了以下内容:

   On error, -1 is returned, and errno is set appropriately.  In this
   case, it is left unspecified whether the file position (if any)
   changes.

而在fread()中,对应的片段如下:

   If an error occurs, or the end of the file is
   reached, the return value is a short item count (or zero).
   ...
   **fread()** does not distinguish between end-of-file and error, and
   callers must use feof(3) and ferror(3) to determine which occurred.

我的问题 - read() 区分 EOF 和错误,而 fread() 不区分是否有任何实际原因?

提前致谢!

fread 的 return 值为 size_t。这是一个无符号类型,因此没有可用值不同于指示读取了多少项的值。

此外,fread() 可能需要多次调用 read() 才能读取所有请求的项目。如果在后面的一次读取中发生错误或 EOF,它应该仍然 return 之前成功读取的所有项目。所以它 return 那个项目计数。

由于无法在 return 值中编码短项目计数的原因,因此需要有一些其他方式来 returning 这个。使用 feof()ferror().

将其留给调用者更容易

如果read()在部分读取后遇到错误,这通常被视为成功。它 returns 读取的数据的长度。直到 下一次 调用 read() 时,调用方才发现错误,当时它 returns -1 并设置 errno.

一个信号也会导致 read() 提前到 return。在这种情况下,它 returns -1 并设置 errno == EINTR。内核将部分读取保存在缓冲区中,以便可以在下一次调用时 returned。