У меня есть небольшой пример программы, которая просто fopen
s файл и использует fgets
для его чтения. Используя strace
, я замечаю, что первый вызов fgets
запускает системный вызов mmap
, а затем системные вызовы read используются для фактического чтения содержимого файла. на fclose
файл munmap
ред. Если я вместо этого открываю чтение файла с открытием / чтением напрямую, это, очевидно, не происходит. Мне любопытно, какова цель этого mmap
и что он выполняет.
В моей системе, основанной на Linux 2.6.31, при большой нагрузке на виртуальную память эти mmap
иногда зависают на несколько секунд и кажутся мне ненужными.
Пример кода:
#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