这一段被共享内存搞的有点崩溃。有俩进程,一个负责写共享内存,一个负责读共享内存。但是这里面有个麻烦的地方是,写进程每几秒钟就会申请一个新的20M的共享内存(因为有些原因,不能使用同一个共享内存),为了防止共享内存消耗过大,它维护了一个长度20的vector,当超出时就删掉共享缓冲区,调用的shmDel操作。读进程也会从相应的新的共享内存中读取新的数据。但是随着时间的推移,出现了Bus error。
原来以为是字节对齐的问题,但是我们使用的x86架构的服务器,并且申请的空间都是4096的整数倍。后面经过不断的查看进程资源,发现读进程的内存消耗量不断增加,但是写进程基本没有太大变化。后面经过排查代码,发现读进程没有显示地调用shmDel操作。因为当时给出来的反馈是,读进程会自动销毁。
实际上,System V的共享内存与mmap不同,它是通过映射内核中特殊文件系统shm中的文件来实现的。这样,System V中的共享内存的对象如果没有被显示地删除的话,及时所有访问共享内存的进程都已经终止了,该共享内存区域的对象仍然会在内核中出现,也就是System V的共享内存对象的生命周期是和系统内核的生命周期一致的。而通过mmap获得的内存映射用于进程间通信时,一定要考虑进程终事件对通信的影响。
另外,System V的共享内存中的数据从不会写入到实际磁盘中去。它只是为了实现进程间共享数据和传递数据。