fopen() 和 open() 之间缓冲区的概念

问题描述 投票:0回答:1

我读过C fopen 与 open

我知道

fopen()
open()
之间的区别在于是否使用 buffer

关于上面文章提到的缓冲区,我想:

1.缓冲区是否意味着在调用
fopen()
时需要额外的 1 页 MMU?

假设MMU已启用且1页MMU为4K字节。

即使我想读取的文件只有 2 个字符(2 个字节 + 1 个 EOF),

当我在程序中调用

fopen()
时,最小额外空间成本为 1 页 (4KB)。

但是,我用

open()
read
)读取文件:
char buffer[3]; read(fd, buffer, 3)

这意味着额外的空间只需要3个字节,对吧?

2.小尺寸内容使用
open()
,大尺寸内容使用
fopen()

如上所述。

  • 如果我想读取一个字节的文件,例如传感器的值(/dev/iio/sensor1),

    open()
    +
    read()
    fopen()
    +
    fgets()
    更好。

  • 如果我要读取的文件是 4K 图像,请选择

    fopen()
    +
    fgets()

对吗?

c posix fopen
1个回答
0
投票

缓冲区是否意味着调用 fopen() 时需要额外的 1 页 MMU?

不一定。

fopen()
将使用它喜欢的任何机制在内存中分配一个缓冲区。最有可能的是它会
malloc
空间。缓冲区大小不一定是一页。这只是一个实现细节,总体上您无需担心。

小尺寸内容使用

open()
,大尺寸内容使用
fopen()

我建议始终使用

fopen()
,除非有特殊情况需要较低级别的调用。
fopen()
是标准 C,因此保证受到任何兼容的 C 实现的支持。

如果你只想打开一个文件读取少量固定字节数然后关闭它,直接使用系统调用会更快,但使用缓冲 IO 引入的开销很可能与读取所需的时间相形见绌。操作系统从存储设备中获取字节(您的情况可能会有所不同 - 对其进行基准测试)。

© www.soinside.com 2019 - 2024. All rights reserved.