zoukankan      html  css  js  c++  java
  • 细说linux IPC(四):posix 共享内存

    【版权声明:尊重原创。转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途】
            上一节讲了由open函数打开一个内存映射文件。再由mmap函数把得到的描写叙述符映射到当前进程地址空间中来。

    这一节说说第二种类似的共享内存方法。即有shm_open函数打开一个Posix.1 IPC名字(或许是文件系统中的一个路径名)。所返回的描写叙述符由函数mmap映射到当前进程地址空间。
            
    posix共享内存和尚上一节类似,首先须要制定一个名字參数调用shm_open 。以创建一个新的共享内存对象或打开一个已存在的共享内存对象;然后再调用mmap把共享内存区映射到调用进程的地址空间中。


    shm_open函数原型例如以下:

           #include <sys/mman.h>
           #include <sys/stat.h> /* For mode constants */
           #include <fcntl.h> /* For O_* constants */
    
           int shm_open(const char *name, int oflag, mode_t mode);
    
           Link with -lrt.
    參数name为将要被打开或创建的共享内存对象,须要指定为/name的格式。


    參数oflag必需要有O_RDONLY(仅仅读)、标志O_RDWR(读写)。除此之外还能够指定O_CREAT(没有共享对象则创建)、O_EXCL(假设O_CREAT指定,但name不存在,就返回错误)、O_TRUNC(假设共享内存存在,长度就截断为0)。
    參数mode为指定权限位。在指定了O_CREAT的前提下使用,假设没有指定O_CREAT,mode能够指定为0.

    该函数返回一个描写叙述符,在mmap函数(见上一节)第五个參数使用。

    #define SHM_IPC_FILENAME "sln_shm_file"
    #define SHM_IPC_MAX_LEN 1024 

    ser:
    int sln_shm_get(char *shm_file, void **shm, int mem_len)
    { 
        int fd;
    
        fd = shm_open(shm_file, O_RDWR | O_CREAT, 0644);
        if (fd < 0) {
            printf("shm_open <%s> failed: %s
    ", shm_file, strerror(errno));
            return -1;
        }
    
        ftruncate(fd, mem_len);
    
        *shm = mmap(NULL, mem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        if (MAP_FAILED == *shm) {
            printf("mmap: %s
    ", strerror(errno));
            return -1;
        }
    
        close(fd);
    
        return 0;
    }
    
    int main(int argc, const char *argv[])
    {
        char *shm_buf = NULL;
    
        sln_shm_get(SHM_IPC_FILENAME, (void **)&shm_buf, SHM_IPC_MAX_LEN);
    
        snprintf(shm_buf, SHM_IPC_MAX_LEN, "ipc client get: hello posix share memory ipc! This is write by server.");
    
        return 0;
    }
    编译运行结果例如以下:

    # ./server 
    # ./client 
    ipc client get: hello posix share memory ipc! This is write by server.
    #

    shm_open创建的文件位置位于 /dev/shm/ 文件夹下:
    # ll /dev/shm/ 
    -rw-r--r-- 1 root root 8193 Oct 30 14:13 sln_shm_file 
    #

    posix共享内存同步能够使用posix信号量来实现,具体在后面同步相关专栏会有具体解说。
    本节源代码下载:
    http://download.csdn.net/detail/gentleliu/8140869



  • 相关阅读:
    ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递
    SQLServer树形数据结构的数据进行数据统计
    sqlserver时间字符串的截取
    SQL Server 表字段值转换成字段名称(二)
    SQL Server 表字段值转列名 示例
    MiniProfiler在MVC5下的使用记录
    BeetleX使用经验记录
    .NET程序与FIPS兼容性问题(转)
    VS2015下的Android开发系列02——用VS开发第一个Android APP
    VS2015下的Android开发系列01——开发环境配置及注意事项
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7297506.html
Copyright © 2011-2022 走看看