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) |