gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:35:54 26 4
gpt4 key购买 nike

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>

最佳答案

POSIX 与 Linux

首先,一些事实:

  • POSIX 是一个标准,由标准机构制定。 POSIX 没有
    实现任何东西,而是定义功能集和行为
    接口(interface)。这个定义的一部分是一些手册页——
    《POSIX 程序员手册》
  • Linux 实现了 POSIX 标准,就像其他 UNIX
    操作系统可以。 (我不知道 Linux 是否经过“POSIX 认证”,
    我也不关心。)在实现 POSIX 标准时,Linux 采用
    使用 Linux 特定功能自由扩展标准;因此
    它有一套自己的手册页,“Linux Programmer's
    手册”。

  • 查看 Linux (" man 2 mmap ") 手册页,您可以看到它
    例如,定义 MAP_LOCKED flags 参数中的位
    (顺便说一句。 MAP_LOCKED 不需要单独调用 mlock())。这个
    flag 没有出现在 POSIX 手册页(“ man 3 mmap”)中,因为它
    POSIX 标准不要求符合标准的实现。

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

    POSIX 版本分别包含在 Linux 中
    执行。 Linux 与 POSIX “兼容”,可以这么说 - 它确实
    不重新定义 POSIX 要求的任何特性(这意味着违反标准),而只是添加扩展
    喜欢 MAP_LOCKED以上。

    手册页

    嗯。我个人的看法是,POSIX 版本的 mmap手册页只是为了迷惑用户。如果不小心撞到
    “3”部分 mmap()手册页,你不知道什么关系
    介于 POSIX 和 Linux 之间,那么您确实很困惑
    最好的,或者在最坏的情况下走上错误的轨道。

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

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

    系统调用

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

    关于linux - linux系统调用mmap(2)和posix mmap(3)函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61401553/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com