共享内存:进程直接访问共享内存,由使用者进行访问控制(互斥等)
使用ipcs命令查看系统共享内存
#include
#include //memory management
#include //include O_* macros
#include
#include
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;
}
#include
#include
#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);
}