• 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下用这几个函数可以实现不同进程之间的共享内存,同时也要配合同步的对象来实现。
     

  • 相关阅读:
    列表类型高级用法
    西门子S7-200系列PLC
    指挥中心实战指挥平台-通信指挥类装备多链路聚合设备解决方案实例
    linux中的帮助命令man,help
    阿里三年功能测试的一些感悟
    【电脑使用】CCleaner使用的坑
    学校教务管理系统的设计与实现--Word文档可在最后链接处下载,无code
    uniapp H5的弹窗滚动穿透解决
    python IP 端口 socket tcp 介绍
    java基于ssm校园车辆 校车管理系统
  • 原文地址:https://blog.csdn.net/u012294613/article/details/126640135