linux 共享内存

本文详细介绍了共享内存的创建函数 shmget,如何通过 ftok 和 key_t 定义私有或公共标识,shmat用于连接共享内存,shmdt实现内存断开,以及shmctl进行内存控制,包括IPC_STAT、IPC_SET和IPC_RMID操作。提醒读者注意内存资源释放和进程同步问题。

共享内存常用函数原型

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之后内存段才会真正的从系统资源中删除
  • 共享内存属于系统资源,使用完成之后一定要删除,否则会一直存在系统中(和进程是否退出无关)
  • 共享内存需要注意进程间同步问题,可以使用信号量来同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值