IPC---共享内存
进程间通信的一种方式,多个进程共享一段内存,即“共享内存
”。与其他的ipc方式(如:pipe,fifo,messages)相比少copy一次内存
共享内存接口函数
shmget
创建新的,或者获取已有的共享内存
1 |
|
key
: 类似共享内存的标签,如果key值没有对应任何共享内存,则创建一个新的共享内存;如果已存在,则直接使用创建好的共享内存由
ftok
生成的key标识,标识系统的唯一IPC资源- 返回值: 返回共享内存的标识符,用于后续对该共享内存的操作
shmat
将shmid所指向的共享内存空间映射到进程空间(虚拟内存空间),并返回影射后的起始地址(虚拟地址)。有了这个地址后,就可以通过这个地址对共享内存进行读写操作。
1 |
|
shmctl
取消建立的映射
1 |
|
共享内存的使用步骤
- 进程调用shmget函数创建新的或获取已有共享内存
- 进程调用shmat函数,将物理内存映射到自己的进程空间,说白了就是让虚拟地址和真实物理地址建议一一对应的映射关系。
- shmdt函数,取消映射
- 调用shmctl函数释放开辟的那片物理内存空间和消息队列的msgctl的功能是一样的,只不过这个是共享内存的。
共享内存的删除
- 重启OS,很麻烦,服务器也不是随随便便就让你去重启的。
- 进程结束时,调用相应的API来删除
- 使用ipcrm命令删除
查看当前系统中的共享内存
1 | ipcs -m |
参考
- 共享内存详解(本机IPC)【linux】
- 共享内存函数(shmget、shmat、shmdt、shmctl)及其范例