Posix 共享内存区

要点

与mmap配合使用
open与shm_open的区别,open打开磁盘上的普通文件,shm_open创建和打开的文件在/dev/shm文件夹下,该文件夹对应的是内存
gcc编译时加参数-lrt
shm_open的第一个参数名字的形式: /name, 如"/myshm"

基本函数

#include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t mode);
int shm_unlink(const char *name);
 
#include <unistd.h>
int ftruncate(int fd, off_t length);
 
#include <sys/types.h>
#include <sys/stat.h>
int fstat(int fd,struct stat *buf);
struct stat{
    ...
    mode_t st_mode;
    off_t st_size;
    ...
};

shm_open用于创建或打开内存文件
shm_unlink用于删除内存文件的名字,并不影响已经打开的进程
ftruncate用于调整内存文件的大小
fstat用于获取文件的属性

例子

用open和shm_open两种方式创建内存共享区;打印父子进程中两个共享区的内存地址

#include "unpipc.h"
#include <sys/stat.h>
#include <sys/mman.h>
 
int main(int argc, char *argv[]){
    int fd1,fd2,*ptr1,*ptr2;
    pid_t childpid;
    struct stat st;
 
    if(argc != 2)
        err_quit("usage: ./shm <name>");
    shm_unlink(argv[1]);
    fd1=shm_open(argv[1],O_RDWR|O_CREAT|O_EXCL,0644);
    ftruncate(fd1,sizeof(int));
    fd2=Open("./shm.c",O_RDONLY,0);
    fstat(fd2,&st);
 
    if((childpid=Fork()) == 0){
        ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
        ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
        printf("child: shm ptr=%p, shm.c ptr=%p\n",ptr1,ptr2);
        sleep(5);
        printf("shared memory integer=%d\n",*ptr1);
        exit(0);
    }
 
    ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
    ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
    printf("father: shm ptr=%p, shm.c ptr=%p\n",ptr1,ptr2);
    *ptr1=777;
    waitpid(childpid,NULL,0);
 
    exit(0);
}
posted @ 2016-09-03 09:26  cfans1993  阅读(170)  评论(0编辑  收藏  举报