linux的mmap在windows下的等价实现
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下用这几个函数可以实现不同进程之间的共享内存,同时也要配合同步的对象来实现。
更多推荐
所有评论(0)