共享内存使用示例
- 环境:ubuntu 18.04
- 命令:ipcs(查看ipc信息)、ipcrm(删除指定ipc)、ipcmk(创建指定类型的ipc),可以通过
--help
查看帮助信息
公共代码
共享内存示例代码及说明
shmget/shmctl
通过shmget
创建共享内存,并使用ls
命令查看/dev/shm
路径下是否会创建对应的文件
结论:没有在该路径下创建shm文件,只有通过shm_open创建的共享内存才会在该路径下创建文件
另外,shm不属于进程,因此当进程结束时并不会销毁,需要使用shmctl进行rm或者使用ipcrm命令显示的rm
通过共享内存在父子进程中通信
创建共享内存,然后在子进程获取对应的内存地址,并进行修改,然后在父进程中输出对应信息
注意:如果使用fork,那么不要在fork后的if-else语句外面再执行其他代码,避免在子进程中忘记return造成本来不想在子进程中执行的代码被执行
通过shm_open和mmap共享内存进行通信
通过shm_open
创建共享内存文件,并使用ls
命令查看/dev/shm
路径下是否会创建对应的文件
步骤:
- 使用
shm_open
打开/创建一个共享内存文件,只需要指定名字,成功返回大于0
的fd
- 使用
ftruncate
将 shm_open
返回的 fd
设置为指定大小 - 使用
mmap
将 shm_open
返回的 fd
映射到内存,并返回对应的内存地址 - 对内存地址进行操作
- 使用完毕后,需要进行
munmap
以及 shm_unlink
操作
结论:
- 有在该路径下创建同名的文件,其他的和
shmget
一样 - 即使删除了
/dev/shm/
下面的共享内存文件,之前通过mmap
进行映射的内存地址仍然可以用于通信 - 如果删除了
/dev/shm/
下面的共享内存文件,进行 shm_unlink
的时候会报错,提示 No such file or directory
-
shm_open
创建的共享内存文件,只需要在某一个进行进行 shm_unlink
即可,重复进行该操作会报错,提示 No such file or directory
- 可以对同一
mmap
返回的地址进行重复的 munmap
,不会报错 - 进行
munmap
后, 将不能再对 mmap
返回的地址进行读写操作,否则会烦死段错误(Segmentation fault (core dumped))