阅读之前请先参考先前的一篇关于共享内存的详细介绍点击打开链接
shm_open 函数
功能:
用来创建或打开一个共享内存对象
原型:
int shm_open(const char* name,int oflag,mode_t mode);参数:
name:共享内存对象的名字
oflag:与open 函数类似,可以是O_RDONLY,O_RDWR,还可以按位或上O_CREAT,O_EXCL,O_TRUNC等.
mode:此参数总是需要设置,如果oflag没有指定 O_CREAT, 可以指定为0;
返回值:
成功返回非负整数文件描述符;失败返回-1
ftruncate
功能:
修改共享内存对象大小
原型:
int ftruncate(int fd,off_t length);
参数:
fd:文件描述符
length:长度
返回值:
成功返回0,失败返回-1
fstat函数
功能:
获取共享内存对象信息
原型:
int fstat(int fd,struct stat *buf);参数:
fd: 文件描述符
buf: 返回共享内存状态
返回值:
成功返回0,失败返回-1
shm_unlink函数
功能:
删除一个共享内存对象
原型:
int shm_unlink(const char* name);
参数:
name:共享内存对象的名字
返回值:
成功返回0,失败返回-1;
前面几个函数的应用代码
#include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/mman.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) typedef struct stu { char name[32]; int age; }STU; int main(void) { int shmid; shmid=shm_open("/xyz",O_CREAT | O_RDWR,0666); if(shmid==-1) ERR_EXIT("shm_open"); printf("shm_open succ\n"); //修改共享内存大小 if(ftruncate(shmid,sizeof(STU))==-1) ERR_EXIT("ftruncate"); struct stat buf; //获取共享内存对象信息 if(fstat(shmid,&buf)==-1) ERR_EXIT("fstat"); //共享内存的状态信息 //共享内存的大小和权限 printf("size=%ld mode=%o\n",buf.st_size,buf.st_mode & 07777); //和文件的关闭方式一样 close(shmid); return 0; }
mmap函数
功能:
将共享内存对象映射到进程地址空间.
原型:
void *mmap(void *addr,size_t len,int prot,int flags,int fd,off_t offset);
参数:
addr:要映射的起始地址,通常指定为NULL,让内核自动选择len: 映射到进程地址空间的字节数
prot: 映射区保护方式
flags: 标志
fd: 文件描述符
offset: 从文件头开始的偏移量
返回值:
成功返回映射到的内存区的起始地址,失败返回-1
应用代码
往共享内存写数据
#include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/mman.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) typedef struct stu { char name[32]; int age; }STU; int main(void) { int shmid; shmid=shm_open("/xyz",O_RDWR,0666); if(shmid==-1) ERR_EXIT("shm_open"); printf("shm_open succ"); struct stat buf; if(fstat(shmid,&buf)==-1) ERR_EXIT("fstat"); //共享内存的状态信息 //共享内存的大小和权限 printf("size=%ld mode=%o\n",buf.st_size,buf.st_mode & 07777); //将共享内存映射到进程的地址空间 STU *p; p=mmap(NULL,buf.st_size,PROT_WRITE,MAP_SHARED,shmid,0); if(p==MAP_FAILED) ERR_EXIT("mmap"); //往共享内存中写入一些数据 strcpy(p->name,"test"); p->age=20; //和文件的关闭方式一样 close(shmid); return 0; }
读共享内存中的数据
#include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/mman.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0) typedef struct stu { char name[32]; int age; }STU; int main(void) { int shmid; shmid=shm_open("/xyz",O_RDONLY,0666); if(shmid==-1) ERR_EXIT("shm_open"); printf("shm_open succ"); struct stat buf; if(fstat(shmid,&buf)==-1) ERR_EXIT("fstat"); //共享内存的状态信息 //共享内存的大小和权限 printf("size=%ld mode=%o\n",buf.st_size,buf.st_mode & 07777); //将共享内存映射到进程的地址空间 STU *p; p=mmap(NULL,buf.st_size,PROT_READ,MAP_SHARED,shmid,0); if(p==MAP_FAILED) ERR_EXIT("mmap"); printf("name=%s age=%d\n",p->name,p->age); //和文件的关闭方式一样 close(shmid); return 0; }