Posix 内存共享:
先调用shm_open然后再调用mmap,共享内存区对象的大小可在任何时刻通过ftruncate修改。
System V内存共享:
共享内存区是先调用shmget再调用shmat,其大小是在调用shmget创建时固定下来的。
因为Posix 接口较简洁,下面实列介绍Posix 共享内存的使用。System V内存共享的使用请参考SystemV内存共享示例。
Posix 内存共享服务端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
char buf[10];
char *ptr;
int main()
{
int fd;
/*shm_open最主要的操作也是默认的操作就是在/dev/shm/下面,建立一个文件。文件名字是用户自己定义的。当然shm_open 也可以直接用open替换比如open("/tmp/memRegion", O_RDWR | O_CREAT , 0666)*/
fd = shm_open("region", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd<0) {
printf("error open region\n");
return 0;
}
/* 一定要设置共享映射文件的大小,否则会段错误,调试时浪费了不少时间!*/
ftruncate(fd, 10);
ptr = mmap(NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
printf("error map\n");
return 0;
}
*ptr = 0x12;
return 0;
}
Posix 内存共享客户端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
char buf[10];
char *ptr;
int main()
{
int fd;
fd = shm_open("region", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd<0) {
printf("error open region\n");
return 0;
}
/* 因为服务端已经设置好了大小,此处也可以不用设置!*/
ftruncate(fd, 10);
ptr = mmap(NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
printf("error map\n");
return 0;
}
while (*ptr != 0x12);
printf("ptr : %d\n", *ptr);
return 0;
}
也可以参考:linux内存共享