细说linux IPC(四):posix 共享内存

上一节讲了由open函数打开一个内存映射文件,再由mmap函数把得到的描述符映射到当前进程地址空间中来。这一节说说另外一种类似的共享内存方法,即 有shm_open函数打开一个Posix.1 IPC名字(也许是文件系统中的一个路径名),所返回的描述符由函数mmap映射到当前进程地址空间。
        
posix共享内存和尚上一节类似,首先需要制定一个名字参数调用shm_open ,以创建一个新的共享内存对象或打开一个已存在的共享内存对象;然后再调用mmap把共享内存区映射到调用进程的地址空间中。
shm_open函数原型如下:
  1. #include <sys/mman.h>  
  2. #include <sys/stat.h> /* For mode constants */  
  3. #include <fcntl.h> /* For O_* constants */  
  4.   
  5. int shm_open(const char *name, int oflag, mode_t mode);  
  6.   
  7. 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函数(见上一节)第五个参数使用。
  1. #define SHM_IPC_FILENAME "sln_shm_file"  
  2. #define SHM_IPC_MAX_LEN 1024   

ser:
  1. int sln_shm_get(char *shm_file, void **shm, int mem_len)  
  2. {   
  3.     int fd;  
  4.   
  5.     fd = shm_open(shm_file, O_RDWR | O_CREAT, 0644);  
  6.     if (fd < 0) {  
  7.         printf("shm_open <%s> failed: %s\n", shm_file, strerror(errno));  
  8.         return -1;  
  9.     }  
  10.   
  11.     ftruncate(fd, mem_len);  
  12.   
  13.     *shm = mmap(NULL, mem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  
  14.     if (MAP_FAILED == *shm) {  
  15.         printf("mmap: %s\n", strerror(errno));  
  16.         return -1;  
  17.     }  
  18.   
  19.     close(fd);  
  20.   
  21.     return 0;  
  22. }  
  23.   
  24. int main(int argc, const char *argv[])  
  25. {  
  26.     char *shm_buf = NULL;  
  27.   
  28.     sln_shm_get(SHM_IPC_FILENAME, (void **)&shm_buf, SHM_IPC_MAX_LEN);  
  29.   
  30.     snprintf(shm_buf, SHM_IPC_MAX_LEN, "ipc client get: hello posix share memory ipc! This is write by server.");  
  31.   
  32.     return 0;  
  33. }  
编译执行结果如下:

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

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

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。