c - read, fread 部分读取

标签 c linux system-calls fread

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

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

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

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

谢谢

最佳答案

read的总体思路|是它会在某些数据可用时立即返回¹。从应用程序的角度来看,这就是您可以假设的全部内容。

如果您正在实现 read内核驱动程序中的回调,这取决于你什么时候read决定返回一些数据。但是应用程序将²期望read调用可能是部分的,他们应该调用 read如果他们确实需要一定数量的字节,则在循环中。一些应用程序需要 read不要阻止,所以阻止 read 是个坏主意如果有一些数据可用,请调用。

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

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

关于c - read, fread 部分读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53452824/

相关文章:

linux - QEMU 错误且权限被拒绝

c - 如何让系统调用 write() 打印到屏幕上?

linux - 网络系统调用在 x86 上多路复用,但在 x64 上没有

c - Linux - 为什么自定义系统调用不能正常使用负数?

c - 是否有 Windows 等同于标准(ish)UN*X 进程退出代码?

c - 从此函数传递值

c - 如何检测数组中的重复项并打印非重复项?

c++ - 从 C++ 程序读取 gsettings

linux - bash 如何关闭/dev/tty?

c - ARM - 加载和存储汇编指令