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

问题描述 投票:0回答:3

Linux系统调用mmap(2)和posix mmap(3)函数之间有什么区别?浏览源代码时如何区分使用哪个,因为它们具有相同的头文件。有关详细信息,请参见下文。

我正在Ubuntu上运行。我认为您所使用的操作系统无关紧要。手动页面实际上并没有提供很多有用的信息。

根据JörgW 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>
linux ubuntu posix embedded-linux difference
3个回答
4
投票

POSIX与Linux

首先,一些事实:

  1. POSIX是标准,由标准机构制定。 POSIX不实施]],而是定义功能集和行为接口。此定义的一部分是许多手册页-“ POSIX程序员手册”
  2. Linux implements
  3. POSIX标准,就像其他UNIX操作系统呢。 (我不知道Linux是否经过“ POSIX认证”,也不在乎。)在实施POSIX标准时,Linux采用了具有Linux特定功能的自由扩展标准;因此它带来了自己的一套手册页,“ Linux程序员的手册”。

    查看Linux(“ man 2 mmap”)手册页,您可以看到它定义例如flags参数中的MAP_LOCKED位(顺便说一下,MAP_LOCKED不需要单独调用mlock())。这个标记不会出现在POSIX手册页(“ man 3 mmap”)中,因为它不需要POSIX标准的一致性实现。

就是说,无法使用以下替代实现Linux中的mmap()。如果您正在读取的某些源代码使用mmap(),并且您使用的是Linux,则只需使用mmap()的Linux实现因为没有POSIX实现。

分别在Linux中,POSIX版本为包含

实施。 Linux与POSIX“兼容”,可以这么说-不重新定义POSIX所需的任何功能(这意味着违反标准),而仅添加扩展就像上面的MAP_LOCKED

手册页

嗯。我个人认为[POS]版本是mmap手册页只是在混淆用户。如果您无意中碰到了“ 3” mmap()手册页中,您不知道它们之间的关系在POSIX和Linux之间,那么您的确感到非常困惑最好,或者最坏的时候走错了路。

我建议您省略章节号,只说“ man mmap”-这将搜索所有手册出现“ mmap”的部分,并在第一个位置停止(确切定义请参见“ man man”)。

(当您处于以下状态时,这与“ man write”的设想不符搜索write()系统调用的定义,因为是命令“ write”,与“ 1”节中的命令相同:-))

系统调用

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

Linux系统mmap(2)和posix mmap(3)函数之间有什么区别?

第2节介绍了系统调用。第3节介绍了功能。因此,mmap(2)根本不是函数,它是系统调用。

在浏览源代码时如何区分使用哪个?

如果是函数调用,则为mmap(3)。如果是系统调用,则为mmap(2)。由于不可能从C移植可调用的系统调用,因此系统调用总是会有某种宏或包装函数。

此外,除非您正在阅读C编译器的运行时库的源代码(例如GCC)或POSIX库的源代码(例如Glibc,Dietlibc,µClibc或musl),否则您极不可能将在代码中找到任何系统调用。

但是我想知道为什么使用mmamp(3)函数时不需要显式链接到posix库。

您不需要链接另一个库,因为mmap包含在GLIBC中;你可以看到这个e。 G。与

 nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep mmap
00000000000e4610 W mmap
00000000000e4610 W mmap64

0
投票

Linux系统mmap(2)和posix mmap(3)函数之间有什么区别?


0
投票

但是我想知道为什么使用mmamp(3)函数时不需要显式链接到posix库。

© www.soinside.com 2019 - 2024. All rights reserved.