ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

共享内存呀

共享内存呀 共享内存Shared Memory是IPC 进程间通信方式之一原理在内核开辟一块物理内存多个进程将这块内存映射到自己的虚拟地址空间直接读写内存无需内核拷贝数据速度最快但没有自带同步互斥一般要搭配信号量、互斥锁使用。完整函数链路ftok()→shmget()→shmat()→ 读写内存 →shmdt()→shmctl()1. ftok —— 生成 IPC 键值 key_t#include sys/types.h #include sys/ipc.hkey_t ftok(const char *pathname, int proj_id);参数说明pathname存在的文件路径必须真实存在一般用当前目录.proj_id项目 ID0~255 之间的整数常用字母如a返回值成功返回key_t类型键值用于 shmget、msgget、semget失败-1设置 errno原理ftok 根据 文件设备号、文件 inode、proj_id 组合算出唯一 key ⚠️ 注意文件删除重建后inode 变化ftok 结果会变。注意用ipcs查看2. shmget —— 创建 / 获取共享内存段建立key和stimid的关系#include sys/ipc.h #include sys/shm.hint shmget(key_t key, size_t size, int shmflg);参数keyftok 得到的键值特殊值IPC_PRIVATE代表私有共享内存只用于亲缘进程size共享内存大小建议 4k 对齐内存页大小shmflg权限 创建标志IPC_CREAT不存在则创建存在直接获取IPC_EXCL搭配 IPC_CREAT存在则报错权限位0666类似文件权限一般就是IPC_CREAT|0666返回值成功shmid 共享内存标识符int后续操作都用它失败-13. shmat —— 挂载映射共享内存到进程虚拟地址(建立映射--获得地址)attach把内核共享内存映射到当前进程地址空间得到可用指针。void *shmat(int shmid, const void *shmaddr, int shmflg);参数shmid要映射的本地内存shmaddr本地可用地址 一般不确定--》NULLshmflg挂载属性0可读可写SHM_RDONLY只读挂载返回值成功返回映射后的起始虚拟地址指针void*强制转换使用失败(void *)-14. shmdt —— 脱离共享内存解除映射detach进程用完共享内存断开映射不会删除内核中的共享内存段int shmdt(const void *shmaddr);参数shmaddrshmat 返回的映射起始地址返回值成功返回 0失败 -1eg:ifshmdt(p)05. shmctl —— 共享内存控制获取信息、删除、设置属性control多功能控制函数最常用IPC_RMID 删除共享内存int shmctl(int shmid, int cmd, struct shmid_ds *buf);参数shmid共享内存 idcmd控制命令重点三个IPC_RMID标记删除共享内存只有所有进程都 shmdt 脱离后内核才真正释放此时 buf 传 NULLIPC_STAT获取共享内存属性存入 bufIPC_SET修改共享内存权限等属性一般就用IPC_RMID3、bufshmid_ds 结构体指针IPC_RMID 填 NULL返回值成功 0失败 - 1eg:if(shmctl(shmid,IPC_RMID,NULL)0)总结:共享内存a.key -- ftokb.shmid -- shmgetc.映射 -- shmatd.解除 -- shmdte.销毁 -- shmctl
返回列表