read, fread 部分读取

read, fread partial reads

我似乎无法在文档中找到关于此的信息。

read 系统调用文档说它可能比指定的读取少。 read是否尝试多次阅读?

我知道 freadread 的包装器。当我调用 fread 时,它是否可能会多次从流中读取直到它获得 0 或读取指定的字节,或者它只会尝试读取一次?

我正在读取在我的内核模块中创建的字符设备,它从数据结构传输信息并支持部分读取。我有兴趣阅读所有数据,直到 returns 0.

谢谢

read 的总体思路是 return 一旦有一些数据可用¹。从应用程序的角度来看,这就是您可以假设的全部内容。

如果您在内核驱动程序中实现 read 回调,则 read 决定何时 return 某些数据由您决定。但是应用程序会期望 read 调用可能是部分的,如果它们确实需要一定数量的字节,它们应该在循环中调用 read。某些应用程序希望 read 不阻塞,因此如果某些数据可用,则在 read 调用中阻塞是个坏主意。

fread 函数会阻塞,直到它读取了请求的字节数,直到它到达文件末尾,或者直到发生错误。它通过在循环中调用 read 来工作。

¹ read 是否以及何时 return 0 字节超出了本答案的范围。
² 或者至少应该。有缺陷的应用程序确实存在。