免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1361 | 回复: 0
打印 上一主题 下一主题

mmap几个概念 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-01 21:21 |只看该作者 |倒序浏览
1,mmap用MAP_PRIVATE时,不管是否有fd,文件内容,都只是与本进程自己有关,当没有fd时,表示是在进程空间总”圈地“,有fd时,是把文件内容映射到进程空间,但对于其他进程,是看不见的,此时映射的是所谓的匿名文件,是请求二进制0的,当fd是通过O_RDONLY打开的时候,不能同时指定PROT_WRITE,只有fd有写权限,才能指定这区域有PROT_WRITE,才能往区域里写入,否则就是只读区域。2,mmap是MAP_SHARED时,是表达与其他进程”共享“该文件的意愿。当其他进程,也通过MAP_SHARED或者不带O_TRUNC的open->write文件操作来跟新文件时,二者是能够相互看到更新的,二者更新的是内存中同一个page cache。特别说下的,open中的O_TRUNC,实际上是先”删除“该文件,重新分配一个新的inode,所以,如果一个进程以PROT_READ和MAP_SHARED进行mmap一个文件到进程空间,但同时有另外进程使用O_TRUNC打开了文件,那么第一个进程中相应的区域会是处于”删除“状态,当然,还是能够读到文件老的内容(及原来inode)的。mmap中有个MAP_DENYWRITE项,本来是用于上面说的这种情况,阻止其他进程再对这个文件进行常规文件操作(指的就是open等操作),但在mmap的man中有:MAP_DENYWRITE              This flag is ignored.  (Long ago, it signalled that attempts to  write  to  the  underlying  file              should fail with ETXTBUSY. But this was a source of denial-of-service attacks.)
但是,在我们的loader中,加载可执行文件运行时,由于loader的代码是内核中运行的,这个选项是有用的,应用程序不能open一个正在运行的可执行文件,会报ETXTBUSY错误。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22255/showart_2137330.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP