mmap (2) против mmap (3) - PullRequest
       10

mmap (2) против mmap (3)

7 голосов
/ 30 августа 2009

Кто-нибудь знает, в чем разница между mmap(2) и mmap(3)? Раздел 3 man описан как «В этой главе описаны все библиотечные функции, кроме библиотечных функций, описанных в главе 2, которые реализуют системные вызовы». mmap(3) не выполняет системный вызов?

Читая две справочные страницы, я вижу, что mmap(2), похоже, принимает гораздо более широкое разнообразие флагов, чем mmap(3), и утверждает, что может отображать пространства ввода-вывода устройства. mmap(3) утверждает, что может отображать "объекты общей памяти" и "объекты типизированной памяти" при добавлении к файлам, но не упоминает ввод / вывод устройства.

Поскольку две функции имеют одно и то же имя, я даже не уверен, как выбрать одну, а другую.

1 Ответ

18 голосов
/ 30 августа 2009

mmap(3) предполагается как функция POSIX . Во всех отношениях он должен обеспечивать ту семантику, которую требует POSIX, даже если она отличается от того, что Linux делает «изначально». mmap(2) является системным вызовом и предоставляет все навороты, которые Линус считает важными. Функция библиотеки C, конечно, реализована с использованием системного вызова.

Чтобы вызвать системный вызов буквально (в обход библиотеки C), вы можете использовать <sys/syscall.h>.

Фактическую реализацию mmap (3) можно найти в библиотеке C . Как вы можете видеть, он обычно передает управление непосредственно в mmap (2), если только во время компиляции (из glibc) mmap2 (2) не был выбран в качестве «back-end».

...