Windows下mmap的等价实现
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的等价实现相关推荐
- Windows下C/C++获取当前系统时间
Windows下CC获取当前系统时间 方案一localtime 优点仅使用C标准库缺点只能精确到秒级 方案二GetLocalTime sys 优点能精确到毫秒级缺点使用了windows API 方 ...
- Windows下的你画我猜 -- 告别效率低下的目录扫描方法
<p></p><h2 id="toc-0">Windows下的"你画我猜" -- 告别效率低下的目录扫描方法</h2& ...
- Linux的.a、.so和.o文件以及与windows下的对应关系
在说明Linux的.a..so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的.lib是静 ...
- windows下创建进程,CreateProcess()详解及用法
windows下想要创建一个子进程不如linux的fork函数来得方便,通过CreateProcess函数创建一个新的进程,函数的定义如下 [cpp] view plain copy BOOL Cr ...
- 删除windows下一些无法删除的文件夹
Windows 下不能够以下面这些字样来命名文件/文件夹,包括:"aux""com1""com2""prn"" ...
- Windows下使用标准Shell接口遍历文件和文件夹
Windows下使用标准Shell接口遍历文件和文件夹(1) 在Windows中我们经常需要遍历一个文件夹或者遍历一个磁盘.本文介绍如何使用标准的Shell接口进行遍历.在介绍过程中会逐步的实现一个类 ...
- Windows下mklink使用, 硬链接, 软链接和快捷方式的区别
Windows下mklink使用, 硬链接, 软链接和快捷方式的区别 mklink是windows系统下创建符号链接和硬链接的命令工具,它是一个很好的解决文件系统问题的工具.使用它需要管理员权限. ...
- os.listdir在linux和windows下结果不同(os.listdir乱序)
最近在处理一组数据的时候发现,linux和windows下处理的结果不同 经过层层排查,确定问题在os.listdir这个函数上 首先,我们知道相同代码,在不同的设备上结果是有可能不同的 原因参考 这 ...
- php sendmail方法,PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
本文实例讲述了PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法.分享给大家供大家参考,具体如下: 1.php mail()函数在windows不能用,需要安装sen ...
最新文章
- 火焰图(Flame Graphs)的安装和基本用法
- Matlab C混合编程
- 快速打开计算机磁盘的软件,提升电脑运行效率, 你需要快速整理磁盘碎片的工具...
- 一张图看懂华为计算全联接2020
- Leetcode 数据结构与算法题解大全——目录(推荐收藏,持续更新)
- 网站漏洞扫描工具_如何实现免费网站漏洞扫描?推荐一款神器给你
- golismero web扫描器
- Vue 犯罪指南:TypeError: Right-hand side of 'instanceof' is not an object
- 刚开完2019WWDC 苹果就被iOS开发者们集体起诉...
- 为什么找不到用户和计算机名,计算机管理里没有(本地用户和组)了为什么怎么恢复...
- 《编译原理》学习笔记 ·002【第二章:文法和语言(形式语言理论)-1】
- 雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条...
- 在MOSS2007中使用收集反馈工作流
- python妹子图软件下载_【简单爬虫】 爬取妹子图 自动下载 [改进]
- 目标检测综述(二:古典方法对比现代方式以及目标检测算法相关概述)
- STIPC-003_编程挑战系列赛第三场(柯柯的期末祝福) _E.公正的决赛
- 小红书年货热潮|品牌场景营销新套路
- NDK-r25交叉编译qemu-7.0.0 第651步报错
- oracle sqlplus建用户,Oracle用SQL Plus创建数据库表空间和用户
- hiho 1082 : 然而沼跃鱼早就看穿了一切
热门文章
- 菜鸟学堂:新手应该掌握的Linux命令(转)
- ldar是什么意思 计算机组成,第一章TEC-9计算机组成和数字逻辑实验系统介绍….PDF...
- ltp分词后处理——强制分词模块
- 行业门槛高、从业年限高、学历要求高,大健康创新企业面临“三高三低”人才困境...
- 理解 AI 最伟大的成就之一:卷积神经网络的局限性
- 微信小程序 之 云开发
- 拓嘉启远电商:拼多多如何完美避开历史最低价
- 十大面试问题解惑,秒杀一切HR、技术面试
- 编写三个系别的学生类:英语系,计算机系,文学系(要求通过继承学生抽象类)各系来显示以下成绩:
- 另一个jar包引不了_佛说:失去是另一种拥有(醍醐灌顶,发人深思!)