【问题标题】:Is there any difference between mmap vs mmap64?mmap 与 mmap64 之间有什么区别吗?
【发布时间】:2019-12-23 10:17:34
【问题描述】:

在 64 位机器上,mmapmmap64 之间有什么区别吗?

还有其他的比如fstat64 vs fstat

回答: 在 64 位 Ubuntu 18 LTS 上, 验证 mmap 和 mmap64 func addr 是否相同。 off_t 和 off64_t 是 64 位的。

fstat/stat 能够返回 > 2 GiB 的文件大小。

代码:

#include <sys/mman.h>
#include <sys/stat.h>
#include <iostream>
using namespace std;

int main(){
    cout << sizeof(off_t) << endl;

    void* a = (void*)&mmap64;
    void * b = (void*)&mmap;
    cout <<  (a ==b) << endl; // same addr 

    a = (void*)&fstat64;
    b = (void*)&fstat;
    cout << (a==b) << endl; // diff addr but able to return > 2 GiB size
 }

【问题讨论】:

    标签: c linux linux-kernel system-calls mmap


    【解决方案1】:

    在 64 位机器上,mmap 和 mmap64 有什么区别吗?

    无。

    引入 *64 接口是为了在 32 位系统上启用 Large File Support。在 64 位系统上没有区别。

    但是,64 位接口实际上并没有直接向用户公开(不是 POSIX 的一部分)。所以你不应该直接使用 *64 接口。如果您碰巧在 32 位系统上需要它们,请使用 glibc 的 feature test macros(例如,_FILE_OFFSET_BITS)。

    宏:_FILE_OFFSET_BITS

    此宏确定应使用哪个文件系统接口,一个替换另一个。 _LARGEFILE64_SOURCE 使 64 位接口可用作附加接口,_FILE_OFFSET_BITS 允许 64 位接口替换旧接口。

    如果 _FILE_OFFSET_BITS 未定义,或者定义为值 32,则不会发生任何变化。使用 32 位接口,并且像 off_t 这样的类型在 32 位系统上的大小为 32 位。

    如果宏定义为值 64,则大文件接口替换旧接口。即,这些函数不能以不同的名称提供(因为它们使用 _LARGEFILE64_SOURCE)。相反,旧函数名称现在引用新函数,例如,对 fseeko 的调用现在确实调用 fseeko64。

    仅当系统提供处理大文件的机制时才应选择此宏。在 64 位系统上,此宏无效,因为 *64 函数与普通函数相同。

    此宏是作为大文件支持扩展 (LFS) 的一部分引入的。

    【讨论】:

      【解决方案2】:

      mmap64() 函数与 mmap() 函数相同,只是它可用于将大于 2 GB 的文件的内存映射到进程内存中。 mmap64() 函数是大文件扩展的一部分。

      来自here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 2017-08-20
        • 2023-02-17
        • 2013-09-13
        • 2017-04-05
        • 2014-09-18
        • 2015-06-14
        相关资源
        最近更新 更多