-
共享内存:进程直接访问共享内存,由使用者进行访问控制(互斥等)
-
使用ipcs命令查看系统共享内存
POSIX 共享内存
有名共享内存
- 多个进程通过共享内存的名字来获取同一块共享内存,实现共享
#include <stdio.h>
#include <sys/mman.h> //memory management
#include <fcntl.h> //include O_* macros
#include <unistd.h>
#include <stdint.h>struct shared_data_t {int32_t data;
};#define SHARED_MEM_NAME "my_shared_memory"int main()
{/** 创建共享内存,其实就是一个共享文件* name: 不能写成/tmp/aaa.sem这样的格式,因为在linux下,sem都是创建在/dev/shm目录下* oflag:操作标志,包含: O_RDONLY,O_RDWR,O_CREAT,O_EXCL,O_TRUNC* mode: 设置创建的共享内存区对象的权限属性* return: 共享内存的文件描述符*/int shm_fd = shm_open(SHARED_MEM_NAME,O_CREAT | O_RDWR,0666);//将文件的大小修改为lengthftruncate(shm_fd, sizeof(struct shared_data_t));//将共享文件映射到进程内存空间struct shared_data_t* data = mmap(NULL, 1024, PROT_READ | PROT_WRITE,MAP_SHARED, shm_fd, 0);if(data == MAP_FAILED){printf("mmap failed!\n");}data->data = 12;//解除内存的映射munmap(data, sizeof(struct shared_data_t));//删除共享内存shm_unlink(SHARED_MEM_NAME);return 0;
}
匿名共享内存
- 通过memfd_create()创建一个匿名共享内存,通过UNIX Socket的控制消息CMSG将该文件描述符fd传递给其它进程,其它进程对该fd进行mmap操作可以的得到共享内存得地址,从而实现内存的共享。
- man memfd_create查看函数具体说明
System V 共享内存
#include <sys/ipc.h>
#include <sys/shm.h>#define PATH_NAME "./"
#define PROJ_ID 0x666
int main()
{//生成一个key来唯一标识一个共享内存key_t key = ftok(PATH_NAME, PROJ_ID);//根据key创建一个共享内存,key要唯一int shmid = shmget(key, 4096, IPC_CREAT | IPC_EXCL);//将共享内存连接到进程地址空间,返回共享内存的地址char* shmaddr = shmat(shmid, NULL, 0);shmaddr = "hello, shared memory!";//取消共享内存和进程的连接shmdt(shmaddr);//删除共享内存shmctl(shmid, IPC_RMID, NULL);}