read, fread 部分读取
read, fread partial reads
我似乎无法在文档中找到关于此的信息。
read
系统调用文档说它可能比指定的读取少。
read
是否尝试多次阅读?
我知道 fread
是 read
的包装器。当我调用 fread
时,它是否可能会多次从流中读取直到它获得 0 或读取指定的字节,或者它只会尝试读取一次?
我正在读取在我的内核模块中创建的字符设备,它从数据结构传输信息并支持部分读取。我有兴趣阅读所有数据,直到 returns 0.
谢谢
read
的总体思路是 return 一旦有一些数据可用¹。从应用程序的角度来看,这就是您可以假设的全部内容。
如果您在内核驱动程序中实现 read
回调,则 read
决定何时 return 某些数据由您决定。但是应用程序会期望 read
调用可能是部分的,如果它们确实需要一定数量的字节,它们应该在循环中调用 read
。某些应用程序希望 read
不阻塞,因此如果某些数据可用,则在 read
调用中阻塞是个坏主意。
fread
函数会阻塞,直到它读取了请求的字节数,直到它到达文件末尾,或者直到发生错误。它通过在循环中调用 read
来工作。
¹ read
是否以及何时 return 0 字节超出了本答案的范围。
² 或者至少应该。有缺陷的应用程序确实存在。
我似乎无法在文档中找到关于此的信息。
read
系统调用文档说它可能比指定的读取少。
read
是否尝试多次阅读?
我知道 fread
是 read
的包装器。当我调用 fread
时,它是否可能会多次从流中读取直到它获得 0 或读取指定的字节,或者它只会尝试读取一次?
我正在读取在我的内核模块中创建的字符设备,它从数据结构传输信息并支持部分读取。我有兴趣阅读所有数据,直到 returns 0.
谢谢
read
的总体思路是 return 一旦有一些数据可用¹。从应用程序的角度来看,这就是您可以假设的全部内容。
如果您在内核驱动程序中实现 read
回调,则 read
决定何时 return 某些数据由您决定。但是应用程序会期望 read
调用可能是部分的,如果它们确实需要一定数量的字节,它们应该在循环中调用 read
。某些应用程序希望 read
不阻塞,因此如果某些数据可用,则在 read
调用中阻塞是个坏主意。
fread
函数会阻塞,直到它读取了请求的字节数,直到它到达文件末尾,或者直到发生错误。它通过在循环中调用 read
来工作。
¹ read
是否以及何时 return 0 字节超出了本答案的范围。
² 或者至少应该。有缺陷的应用程序确实存在。