【发布时间】:2026-02-10 19:30:01
【问题描述】:
我有一个小示例程序,它只是fopens 一个文件并使用fgets 来读取它。使用strace,我注意到对fgets 的第一次调用运行mmap 系统调用,然后read 系统调用用于实际读取文件的内容。在fclose,文件是munmaped。如果我改为直接使用 open/read 打开读取文件,这显然不会发生。我很好奇这个mmap 的目的是什么,以及它正在完成什么。
在我的基于 Linux 2.6.31 的系统上,当需要大量虚拟内存时,这些 mmaps 有时会挂起几秒钟,在我看来是不必要的。
示例代码:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
FILE *f;
if ( NULL == ( f=fopen( "foo.txt","r" )))
{
printf ("Fail to open\n");
}
char buf[256];
fgets(buf,256,f);
fclose(f);
}
这是运行上述代码时相关的 strace 输出:
open("foo.txt", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8039000
read(3, "foo\nbar\n\n"..., 4096) = 9
close(3) = 0
munmap(0xb8039000, 4096) = 0
【问题讨论】: