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