共享内存常用函数原型
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
共享内存创建
int shmget(key_t key, size_t size, int shmflg);
@parma key:一个整数值,不同的进程可以通过它访问同一个信号量,也可以通过ftok获取。特例,IPC_PRIVATE表示私有,仅限当前进程访问。
@param size:共享内存区域大小
@param shmflg:与open标志类似,IPC_CREAT,IPC_EXCL,这里可以指定权限从而限制不同用户或者用户组的读写权限
key_t k = ftok(".",1);
g_shmid = shmget(k,sizeof(struct CMD),0666|IPC_CREAT);
共享内存的attach
void *shmat(int shmid, const void *shmaddr, int shmflg);
@param shmid:共享内存id
@param shmaddr:指定共享内存区域连接到当前进程的地址起始位置。一般指定为NULL,由系统指定。
@parma shmflg:默认直接给0。常规取值
- SHM_RND 与shmaddr联合使用,控制共享内存的链接地址
- SHM_RDONLY 表示内存只读
void *addr = shmat(g_shmid,NULL,0);
共享内存的detach
int shmdt(const void *shmaddr);
@param shmaddr:通过attch链接到当前进程的地址空间地址
如果detach之后,当前进程暂时无法访问共享内存。但是共享内存并未删除,共享内存删除只能通过IPC_RMID
shmdt(addr);
共享内存的ctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
@parma shmid:共享内存id
@parma cmd:需要配合 shmid_ds 使用
- IPC_STAT 获取当前共享内存状态,将结果保存在buf中
- IPC_SET如果权限足够,则把当前内存关联值设置为buf指定的值
- IPC_RMID 删除共享内存段,如果存在多个进程attach,只有第一次调用会成功,但是成功只是标记了内存段为删除状态,直至所有的进程都detach之后内存段才会真正的从系统资源中删除。
int shm_rm(int shm_id)
{
return shmctl(shm_id,IPC_RMID,NULL);
}
注意事项:
- IPC_RMID 删除共享内存段,如果存在多个进程attach,只有第一次调用会成功,但是成功只是标记了内存段为删除状态,直至所有的进程都detach之后内存段才会真正的从系统资源中删除
- 共享内存属于系统资源,使用完成之后一定要删除,否则会一直存在系统中(和进程是否退出无关)
- 共享内存需要注意进程间同步问题,可以使用信号量来同步。
本文详细介绍了共享内存的创建函数 shmget,如何通过 ftok 和 key_t 定义私有或公共标识,shmat用于连接共享内存,shmdt实现内存断开,以及shmctl进行内存控制,包括IPC_STAT、IPC_SET和IPC_RMID操作。提醒读者注意内存资源释放和进程同步问题。
1万+

被折叠的 条评论
为什么被折叠?



