我在文档中找不到关于这个的信息。
read
系统调用的文档说它可能读取少于指定的字节数。 read
是否尝试多次读取?
我知道fread
是read
的包装器。当我调用fread
时,它是否有可能多次从流中读取,直到获取0或读取指定的字节数,或者它只会尝试读取一次?
我正在从我的内核模块中创建的char设备中读取,它可以传输来自数据结构的信息并支持部分读取。我想读取所有数据,直到返回0。
谢谢
我在文档中找不到关于这个的信息。
read
系统调用的文档说它可能读取少于指定的字节数。 read
是否尝试多次读取?
我知道fread
是read
的包装器。当我调用fread
时,它是否有可能多次从流中读取,直到获取0或读取指定的字节数,或者它只会尝试读取一次?
我正在从我的内核模块中创建的char设备中读取,它可以传输来自数据结构的信息并支持部分读取。我想读取所有数据,直到返回0。
谢谢
read
的一般思想是只要有可用数据,它就会立即返回¹。从应用程序的角度来看,这就是你能假定的全部内容。read
回调函数,那么决定何时返回一些数据由你自己决定。但是应用程序² 期望 read
调用可能是部分的,并且如果他们真的需要一定数量的字节,则应调用循环的read
。一些应用程序希望read
不阻塞,因此如果有可用数据,则在read
调用中阻塞将是一个坏主意。
fread
函数会一直阻塞,直到读取了请求的字节数、达到文件的结尾或发生错误为止。它通过在循环中调用 read
来工作。read
可能返回0字节超出了本答案的范围。fread
的参考文献是否正确,就像在POSIX中所写的那样,它说:“如果遇到读取错误或文件结束,则fread()
将返回成功读取的元素数少于nitems”,还是有其他规范实施者用作参考? - nh2
read
会读取你告诉它的字节数。当你从文件中读取时,这不是问题,字节已经存在(除非首先遇到EOF)。因此,在这种情况下,read可能会返回少于请求的字节数。但是,当你从网络连接中读取时,不能保证任何字节在发送方主机发送之前都存在。因此,在这种情况下,很常见的是read
返回少于请求的字节数,直到字节变为可用。 - David C. Rankin