Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152025
  • 博文数量: 2
  • 博客积分: 2049
  • 博客等级: 大尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 17:02
文章分类
文章存档

2011年(1)

2010年(1)

我的朋友

分类: LINUX

2010-01-01 21:21:14

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错误。
阅读(1400) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:博客已升级,请注意变更地址

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