Почему fopen / fgets использует системные вызовы mmap и read для доступа к данным?

У меня есть небольшой пример программы, которая просто 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
10
задан bdk 12 August 2011 в 19:47
поделиться