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