-
共享内存:进程直接访问共享内存,由使用者进行访问控制(互斥等)
-
使用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);
//将文件的大小修改为length
ftruncate(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);
}