mmap是posix标准下的一个函数,它将文件或设备的访问映射到内存中。下面的代码摘自ngx_rtmp_mp4_module.c,nginx的rtmp模块用它来从服务的录制的mp4文件中读取,以rtmp媒体流的形式分发给播放端。这样做可能是由于mp4的atom读取通过文件read和seek的操作不如直接内存映射后来的方便吧。它的给出了win32和linux下的不同实现:

#if (NGX_WIN32)
static void *
ngx_rtmp_mp4_mmap(ngx_fd_t fd, size_t size, off_t offset, ngx_fd_t *extra)
{
    void           *data;

*extra = CreateFileMapping(fd, NULL, PAGE_READONLY,
                               (DWORD) ((uint64_t) size >> 32),
                               (DWORD) (size & 0xffffffff),
                               NULL);
    if (*extra == NULL) {
        return NULL;
    }

data = MapViewOfFile(*extra, FILE_MAP_READ,
                         (DWORD) ((uint64_t) offset >> 32),
                         (DWORD) (offset & 0xffffffff),
                         size);

if (data == NULL) {
        CloseHandle(*extra);
    }

/*
     * non-NULL result means map view handle is open
     * and should be closed later
     */

return data;
}

static ngx_int_t
ngx_rtmp_mp4_munmap(void *data, size_t size, ngx_fd_t *extra)
{
    ngx_int_t  rc;

rc = NGX_OK;

if (UnmapViewOfFile(data) == 0) {
        rc = NGX_ERROR;
    }

if (CloseHandle(*extra) == 0) {
        rc = NGX_ERROR;
    }

return rc;
}

#else

static void *
ngx_rtmp_mp4_mmap(ngx_fd_t fd, size_t size, off_t offset, ngx_fd_t *extra)
{
    void  *data;

data = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset);

/* valid address is never NULL since there's no MAP_FIXED */

return data == MAP_FAILED ? NULL : data;
}

static ngx_int_t
ngx_rtmp_mp4_munmap(void *data, size_t size, ngx_fd_t *extra)
{
    return munmap(data, size);
}

#endif

-------------------------------------------------------代码完---------------------------------------------------------

可以看出在windows下使用的是CreateFileMapping和MapViewOfFile,实际上还有一个函数OpenFileMapping,在windows下用这几个函数可以实现不同进程之间的共享内存,同时也要配合同步的对象来实现。

Windows下mmap的等价实现相关推荐

  1. Windows下C/C++获取当前系统时间

    Windows下CC获取当前系统时间 方案一localtime 优点仅使用C标准库缺点只能精确到秒级 方案二GetLocalTime sys   优点能精确到毫秒级缺点使用了windows API 方 ...

  2. Windows下的你画我猜 -- 告别效率低下的目录扫描方法

    <p></p><h2 id="toc-0">Windows下的"你画我猜" -- 告别效率低下的目录扫描方法</h2& ...

  3. Linux的.a、.so和.o文件以及与windows下的对应关系

    在说明Linux的.a..so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的.lib是静 ...

  4. windows下创建进程,CreateProcess()详解及用法

    windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下 [cpp]  view plain copy BOOL Cr ...

  5. 删除windows下一些无法删除的文件夹

    Windows 下不能够以下面这些字样来命名文件/文件夹,包括:"aux""com1""com2""prn"" ...

  6. Windows下使用标准Shell接口遍历文件和文件夹

    Windows下使用标准Shell接口遍历文件和文件夹(1) 在Windows中我们经常需要遍历一个文件夹或者遍历一个磁盘.本文介绍如何使用标准的Shell接口进行遍历.在介绍过程中会逐步的实现一个类 ...

  7. Windows下mklink使用, 硬链接, 软链接和快捷方式的区别

    Windows下mklink使用,   硬链接, 软链接和快捷方式的区别 mklink是windows系统下创建符号链接和硬链接的命令工具,它是一个很好的解决文件系统问题的工具.使用它需要管理员权限. ...

  8. os.listdir在linux和windows下结果不同(os.listdir乱序)

    最近在处理一组数据的时候发现,linux和windows下处理的结果不同 经过层层排查,确定问题在os.listdir这个函数上 首先,我们知道相同代码,在不同的设备上结果是有可能不同的 原因参考 这 ...

  9. php sendmail方法,PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法

    本文实例讲述了PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法.分享给大家供大家参考,具体如下: 1.php mail()函数在windows不能用,需要安装sen ...

最新文章

  1. 火焰图(Flame Graphs)的安装和基本用法
  2. Matlab C混合编程
  3. 快速打开计算机磁盘的软件,提升电脑运行效率, 你需要快速整理磁盘碎片的工具...
  4. 一张图看懂华为计算全联接2020
  5. Leetcode 数据结构与算法题解大全——目录(推荐收藏,持续更新)
  6. 网站漏洞扫描工具_如何实现免费网站漏洞扫描?推荐一款神器给你
  7. golismero web扫描器
  8. Vue 犯罪指南:TypeError: Right-hand side of 'instanceof' is not an object
  9. 刚开完2019WWDC 苹果就被iOS开发者们集体起诉...
  10. 为什么找不到用户和计算机名,计算机管理里没有(本地用户和组)了为什么怎么恢复...
  11. 《编译原理》学习笔记 ·002【第二章:文法和语言(形式语言理论)-1】
  12. 雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条...
  13. 在MOSS2007中使用收集反馈工作流
  14. python妹子图软件下载_【简单爬虫】 爬取妹子图 自动下载 [改进]
  15. 目标检测综述(二:古典方法对比现代方式以及目标检测算法相关概述)
  16. STIPC-003_编程挑战系列赛第三场(柯柯的期末祝福) _E.公正的决赛
  17. 小红书年货热潮|品牌场景营销新套路
  18. NDK-r25交叉编译qemu-7.0.0 第651步报错
  19. oracle sqlplus建用户,Oracle用SQL Plus创建数据库表空间和用户
  20. hiho 1082 : 然而沼跃鱼早就看穿了一切

热门文章

  1. 菜鸟学堂:新手应该掌握的Linux命令(转)
  2. ldar是什么意思 计算机组成,第一章TEC-9计算机组成和数字逻辑实验系统介绍….PDF...
  3. ltp分词后处理——强制分词模块
  4. 行业门槛高、从业年限高、学历要求高,大健康创新企业面临“三高三低”人才困境...
  5. 理解 AI 最伟大的成就之一:卷积神经网络的局限性
  6. 微信小程序 之 云开发
  7. 拓嘉启远电商:拼多多如何完美避开历史最低价
  8. 十大面试问题解惑,秒杀一切HR、技术面试
  9. 编写三个系别的学生类:英语系,计算机系,文学系(要求通过继承学生抽象类)各系来显示以下成绩:
  10. 另一个jar包引不了_佛说:失去是另一种拥有(醍醐灌顶,发人深思!)