我们解开util-linux-2.12a-16.EL4.6.src.rpm的源码,在文件sys-utils/ipcs.c中的do_shm函数可以看到,程序通过调用shmctl的SHM_INFO命令获取共享内存的整体信息,然后逐段调用shmctl的STAT命令,获取该段内存的信息(就是每一个shmid对应的信息)。当该段内存的mode字段设置了SHM_DEST位时就会显示"dest"字样。
SHM_DEST是内核设置的,接着再看看内核关于实现ipc的源码,在ipc/shm.c中可以看到,当用户调用shmctl的IPC_RMID 时,内核首先看有多少个进程还和这段内存关联着,如果关联数为0,就会销毁(释放)这段内存,否则就设置这段内存的mode位SHM_DEST,并设置它的key为IPC_PRIVATE,这意味着关联着的进程仍可合法存取这端内存,但是它不能再被新的进程关联了。
打个比方,有3个进程关联着同一段共享内存,其中一个进程调用了IPC_RMID,试图删除该段内存,但是由于还有两个进程在使用这段内存,所以结果显示为dest,等其他两个进程退出了这段内存就释放了。
阅读(3724) | 评论(0) | 转发(0) |