我读过C fopen 与 open。
我知道
fopen()
和 open()
之间的区别在于是否使用 buffer。
关于上面文章提到的缓冲区,我想:
fopen()
时需要额外的 1 页 MMU?假设MMU已启用且1页MMU为4K字节。
即使我想读取的文件只有 2 个字符(2 个字节 + 1 个 EOF),
当我在程序中调用
fopen()
时,最小额外空间成本为 1 页 (4KB)。
但是,我用
open()
(read
)读取文件:char buffer[3]; read(fd, buffer, 3)
这意味着额外的空间只需要3个字节,对吧?
open()
,大尺寸内容使用 fopen()
?如上所述。
如果我想读取一个字节的文件,例如传感器的值(/dev/iio/sensor1),
open()
+ read()
比 fopen()
+ fgets()
更好。
如果我要读取的文件是 4K 图像,请选择
fopen()
+ fgets()
对吗?
缓冲区是否意味着调用 fopen() 时需要额外的 1 页 MMU?
不一定。
fopen()
将使用它喜欢的任何机制在内存中分配一个缓冲区。最有可能的是它会malloc
空间。缓冲区大小不一定是一页。这只是一个实现细节,总体上您无需担心。
小尺寸内容使用
,大尺寸内容使用open()
?fopen()
我建议始终使用
fopen()
,除非有特殊情况需要较低级别的调用。 fopen()
是标准 C,因此保证受到任何兼容的 C 实现的支持。
如果你只想打开一个文件读取少量固定字节数然后关闭它,直接使用系统调用会更快,但使用缓冲 IO 引入的开销很可能与读取所需的时间相形见绌。操作系统从存储设备中获取字节(您的情况可能会有所不同 - 对其进行基准测试)。