实现步骤
创建共享内存区
进程1申请一块共享区域,通过shmget函数生成
映射共享内存到进程1
通过shmat实现
映射共享内存到进程2
通过进程1的shmat函数和同一个key值,执行shmat,将内存映射到进程2
进程1和进程2相互通信
进程自己协商处理
撤销内存映射关系
完成通信,需要撤销映射,使用shmdt函数实现
删除共享内存区
shmctl函数实现
主要函数
shmget
参数一:key为共享内存命名;
调用成功,发回与key相关的内存标识符(非负整数);调用失败返回-1;
参数二:size以字节为单位指定需要共享的内存容量;
参数三:shmflg为权限标志,共享内存的权限标志同文件的读写权限一样;
shmat
参数一:shm_id是shmget函数返回的共享内存标识;
参数二:shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址;
参数三:shn_flg为一组标志位,通常为0;
shmdt
作用:将共享内存从当前进程中分离,使该共享内存对当前进程不再可用;
其中shmaddr是shmat函数返回的地址指针,调用成功返回0,失败返回-1;
shmctl
参数一:shmget函数返回共享内存标识符;
参数二:command可以取三个值
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值;
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值;
IPC_RMID:删除共享内存段;
参数三:buf是个结构指针,指向共享内存模式和访问权限的结构;
shmid_ds
至少包括以上这些