linux 系统调用 mmap(2) 和 posix mmap(3) 函数有什么区别?

1 linux ubuntu posix embedded-linux difference

linux 系统调用 mmap(2) 和 posix mmap(3) 函数有什么区别?浏览源代码时如何区分使用的是哪一个,因为它们的头文件是一样的。具体见下。

我在 Ubuntu 上运行。我认为您使用的操作系统无关紧要。手册页确实确实没有提供太多有用的信息。

根据 Jörg W Mittag 的回复,我认为当我浏览源代码时 mmap 必须是 posix 函数。但我想知道为什么我在使用 mmamp(3) 函数时不需要显式链接到 posix 库。我的意思是编译源代码时不需要额外的链接标志。

根据Faschingbauer的回复,如果我们得出没有实现posix mmap的结论,就会出现一些问题。你看,实现了一些posix函数?例如,shm_opn?sem_open,mq_open?。同时?有相应的具有相同的功能(例如,shmget,semget,msgget)。如何解释?至少,我认为一些posix功能是由linux实现的。

#log for "man 2 mmap"
MMAP(2)  Linux Programmer's Manual                                                         
NAME
       mmap, munmap - map or unmap files or devices into memory
SYNOPSIS
       #include <sys/mman.h>



#log for "man 3 mmap"
MMAP(3POSIX)  POSIX Programmer's Manual                                                    
PROLOG
       This  manual page is part of the POSIX Programmer's Manual.  The Linux implementation of this interface may differ (consult the corresponding Linux manual page for details of Linux behavior), or the interface may not be implemented on Linux.    
NAME
       mmap — map pages of memory
SYNOPSIS
       #include <sys/mman.h>
Run Code Online (Sandbox Code Playgroud)

小智 5

POSIX 与 Linux

首先,一些事实:

  1. POSIX 是一个标准,由标准机构制定。POSIX 没有实现任何东西,而是定义了接口的特性集和行为。这个定义的一部分是许多手册页——“POSIX 程序员手册”
  2. Linux实现了 POSIX 标准,就像其他 UNIX 操作系统一样。(我不知道 Linux 是否经过“POSIX 认证”,我也不关心。)在实施 POSIX 标准时,Linux 可以自由地扩展具有 Linux 特定功能的标准;因此它带来了自己的一套手册页,即“Linux 程序员手册”。

查看 Linux (" man 2 mmap") 手册页,您可以看到它定义了例如MAP_LOCKEDflags 参数中的位(顺便说一句,MAP_LOCKEDmlock()不必要的单独调用)。此标志未出现在 POSIX 手册页 (" man 3 mmap") 中,因为 POSIX 标准不需要它来实现一致的实现。

也就是说,没有办法mmap()在 Linux 中使用替代实现 。如果您正在阅读的某些源代码使用mmap(),并且您在 Linux 上,则使用 的 Linux 实现mmap(),因为它没有 POSIX 实现。

POSIX 版本分别包含在 Linux 实现中。Linux 与 POSIX 是“兼容的”,可以这么说 - 它没有重新定义 POSIX 所需的任何功能(这意味着违反标准),而只是添加了MAP_LOCKED上述扩展。

手册页

嗯。我个人的意见是,比如说,mmap 手册页的 POSIX 版本只是为了迷惑用户。如果您无意中点击了“3”mmap()手册页部分,并且您不知道 POSIX 和 Linux 之间的关系,那么充其量您确实很困惑,或者最坏的情况是走错了路。

我建议你省略节号,只说“ man mmap”——这会在所有手册节中搜索“mmap”的出现并在第一个停止(请参阅“ man man”以获得确切的定义)。

man write当您搜索write()系统调用的定义时,这与“ ”的设想不一样,因为write在“1”部分中有一个相同的命令“ ”:-))

系统调用

如“ man man”所述,手册部分“2”包含系统调用文档。知道它mmap()是由 Linux 内核实现的(因为内核实现了诸如内存管理之类的核心操作系统功能)只能帮助消除关于您正在阅读的文档是否是您想要的混淆。