Chinaunix首页 | 论坛 | 博客
  • 博客访问: 327758
  • 博文数量: 104
  • 博客积分: 3025
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-02 11:12
文章分类

全部博文(104)

文章存档

2013年(1)

2011年(2)

2010年(30)

2009年(29)

2008年(8)

2007年(15)

2006年(17)

2005年(2)

我的朋友

分类:

2007-10-22 10:23:27

我们解开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) |
0

上一篇:关于ftp

下一篇:改linux里字符界面的颜色

给主人留下些什么吧!~~