读取,fread部分读取

3

我在文档中找不到关于这个的信息。

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

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

我正在从我的内核模块中创建的char设备中读取,它可以传输来自数据结构的信息并支持部分读取。我想读取所有数据,直到返回0。

谢谢


取决于“stream”是文件还是其他内容。 - user3386109
你有点混淆了概念。read会读取你告诉它的字节数。当你从文件中读取时,这不是问题,字节已经存在(除非首先遇到EOF)。因此,在这种情况下,read可能会返回少于请求的字节数。但是,当你从网络连接中读取时,不能保证任何字节在发送方主机发送之前都存在。因此,在这种情况下,很常见的是read返回少于请求的字节数,直到字节变为可用。 - David C. Rankin
在我的情况下,这是我在内核模块中创建的一个字符设备。它支持部分读取(我维护一个偏移量并将适当的数据写入用户空间缓冲区),但我不知道用户端是否需要在循环中调用设备上的读取操作,或者它是否在内部处理。 - Eloo
1个回答

8
read 的一般思想是只要有可用数据,它就会立即返回¹。从应用程序的角度来看,这就是你能假定的全部内容。
如果你在内核驱动程序中实现 read 回调函数,那么决定何时返回一些数据由你自己决定。但是应用程序² 期望 read 调用可能是部分的,并且如果他们真的需要一定数量的字节,则应调用循环的read。一些应用程序希望read不阻塞,因此如果有可用数据,则在read调用中阻塞将是一个坏主意。 fread 函数会一直阻塞,直到读取了请求的字节数、达到文件的结尾或发生错误为止。它通过在循环中调用 read 来工作。
¹是否以及何时read可能返回0字节超出了本答案的范围。
²或至少应该如此。存在有缺陷的应用程序。

2
特别是,像所有的stdio读取函数一样,fread被指定为表现得好像通过重复调用fgetc直到满足某些条件。 - R.. GitHub STOP HELPING ICE
详细澄清问题:fread的参考文献是否正确,就像在POSIX中所写的那样,它说:“如果遇到读取错误或文件结束,则fread()将返回成功读取的元素数少于nitems”,还是有其他规范实施者用作参考? - nh2
1
@nh2 fread 是标准的 C 函数(不像 read 是 Unix/POSIX 函数)。例如,参见 C11 §7.21.8.1 - Gilles 'SO- stop being evil'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接