获得key值,生成一个具有唯一性的ID,即队列的房间密码。在亲缘关系进程通信的时候,可以直接key = IPC_PRIVATE
key_t ftok(const char *pathname, int proj_id)
pathname:程序范围内已经存在的文件名加绝对路径
proj_id:只有8bits有效,若大于255则只有后8bits有效
返回值:成功 = key值,失败 = -1
创建共享内存
int shmget(key_t key, size_t size, int shmflg)
key:IPC_PRIVATE 或 ftok()得到的值
size:申请的共享内存大小(4K的倍数)
msgflg:共有9个权限标志,可填 IPC_CREAT | 0666 或 IPC_CREAT | IPC_EXCL | 0666 (判断IPC对象是否存在)
返回值:成功 = 共享内存的ID,失败 = -1
映射共享内存到用户空间
void *shmat(int shmid, const void *shmaddr, int shmflg)
shmid:共享内存的ID
shmaddr:NULL = 系统自动选择一个合适的地址
没有指定SHM_RND(命令取整)则共享内存链接到addr指定地址上
非0且指定SHM_RND(命令取整)则共享内存链接到shmaddr -(shmaddr mod SHMLAB【边界地址的倍数 2的n次方】)(该算式的意思是地址向下取最近的SHMLAB的倍数)
shmflg:映射到用户空间的共享内存的权限,SHM_RDONLY = 只读,0 = 读写
返回值:成功 = 映射到用户空间的地址,失败 = (void *)-1
撤销映射,进程结束时自动撤销映射
int shmdt(const void *shmaddr)
shmaddr:映射共享内存到用户空间的地址
返回值:
操作共享内存
删除共享内存时,不会立即删除,直到共享内存映射次数为0
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
shmid:共享内存的ID
cmd:指令,IPC_STAT = 获取共享内存的属性
IPC_SET = 设置共享内存的属性
IPC_RMID = 删除共享内存
buf:存放获取的共享内存属性
返回值:成功 = 0,失败 = -1
send.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
int main(int argc, char const *argv[])
{
key_t k