C ++ MMap файл в память, а затем получить дескриптор файла в эту память - PullRequest
1 голос
/ 14 сентября 2011

Я видел этот пост: системный вызов для сопоставления памяти с файловым дескриптором (обратный mmap)?

Мне бы хотелось, чтобы у моей библиотеки была возможность, чтобы дескриптор файла в ее интерфейсе мог иметь дескриптор файла, который будет читать из области памяти, где я mmap редактировал файл.

Мне нужно что-то с эффектом:

  1. mmap содержимое большого файла (5 ГБ) в памяти

  2. Получить дескриптор файла для этой области памяти

  3. Вызовите библиотеку, которая принимает этот файловый дескриптор, и сделайте что-нибудь

Исходный дескриптор файла, который я использовал для mmap, конечно, не будет работать, поскольку это относится к файлу на диске.

До сих пор я был в состоянии mmap файл в память, однако я назвал fmemopen, но fileno не устанавливается, когда эта функция вызывается. Есть указатели?

Причина, по которой я это делаю, заключается в том, что я пытаюсь уменьшить объем копирования, выполняемого библиотекой при обработке данных в файле.

1 Ответ

1 голос
/ 14 сентября 2011

В каком-то смысле то, что вы спрашиваете, кажется тривиальным.В другом смысле это невозможно.

Если эта область памяти представляет файл, который вы уже mmap отредактировали, то у вас уже есть файловый дескриптор для него, так как вам нужен этот файловый дескриптор для вызова mmap.Если вы отобразили его в режиме MAP_SHARED, изменения в файле через дескриптор файла должны автоматически отображаться в памяти, а изменения в памяти также должны автоматически отображаться в файле.В этом весь смысл mmap в режиме MAP_SHARED.

Хотя, глядя на справочную страницу, возможно, вам придется вызывать msync на некоторых системах, чтобы сделать то, что вы сделали с памятьючтобы отобразиться в файле.

Если у вас есть область памяти, которую вы приобрели, используя malloc или аналогичные средства, а затем просто хотите, чтобы эта область памяти получила файловый дескриптор, это не так.возможно.

...