mmap()系统调用

news/2024/7/4 12:55:59

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。

1、mmap()系统调用形式如下:

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。prot 参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXED,其中,MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。offset参数一般设为0,表示从文件头开始映射。参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。这里不再详细介绍mmap()的参数,读者可参考mmap()手册页获得进一步的信息。

2、系统调用mmap()用于共享内存的两种方式:

(1)使用普通文件提供的内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下:

fd=open(name, flag, mode);
if(fd<0
 ...

ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmap()实现共享内存的通信方式有许多特点和要注意的地方,我们将在范例中进行具体说明。

(2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系的进程之间;由于父子进程特殊的亲缘关系,在父进程中先调用mmap(),然后调用fork()。那么在调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。一般来说,子进程单独维护从父进程继承下来的一些变量。而mmap()返回的地址,却由父子进程共同维护。
对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可,参见范例2。

3、系统调用munmap()

int munmap( void * addr, size_t len )
该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。当映射关系解除后,对原来映射地址的访问将导致段错误发生。

4、系统调用msync()

int msync ( void * addr , size_t len, int flags)
一般说来,进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用munmap()后才执行该操作。可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致。



http://www.niftyadmin.cn/n/3060767.html

相关文章

jstat分析JVM内存

出处&#xff1a;http://liulinxia02.blog.163.com/blog/static/268687720117251501253/ Jstat 是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”&#xff0c;它位于java的bin目录下&#xff0c;主要利用JVM内建的指令对Java应用程序的资…

Linux系统有7个运行级别

Linux系统有7个运行级别(runlevel)运行级别0&#xff1a;系统停机状态&#xff0c;系统默认运行级别不能设为0&#xff0c;否则不能正常启动运行级别1&#xff1a;单用户工作状态&#xff0c;root权限&#xff0c;用于系统维护&#xff0c;禁止远程登陆运行级别2&#xff1a;多…

RCU介绍

http://www.ibm.com/developerworks/cn/linux/l-rcu/

Hive的访问接口

Hive提供了三种客户端访问接口&#xff1a; 1&#xff09;Hive CLI&#xff08;Hive Command Line&#xff0c;Hive命令行&#xff09;&#xff0c;客户端可以直接在命令行模式下进行操作。 2&#xff09;hwi&#xff08;Hive Web Interface&#xff0c;Hive Web接口&#xff0…

centos挂载错误

[rootlocalhost ~]# mount /dev/cdrom /mnt/cdrom/mount: block device /dev/sr0 is write-protected, mounting read-only虚拟机挂着光驱光驱时提示只读&#xff0c;用以下命令可解决该报错&#xff0c;mount -o remount,rw /dev/cdrom /mnt/cdrom转自&#xff1a;http://blog…

Hive基本命令整理

创建表&#xff1a; hive> CREATE TABLE pokes (foo INT, bar STRING); Creates a table called pokes with two columns, the first being an integer and the other a string 创建一个新表&#xff0c;结构与其他一样 hive> create table new_table like reco…

pnfs执行truncate失败的BUG解析

Bug 名称 Truncate操作失败 Bug 描述 使用fstest工具&#xff0c;先执行create再执行truncate后&#xff0c;服务器会返回EIO&#xff0c;而不是期望的0,过一段时间之后&#xff0c;重复执行truncate则成功。 这是导致truncate测试用例所有失败的唯一原因。具体测试脚本在fs…

nilsimsa的大概算法

1. 有一个5个字节的window,沿着文本向右滑动&#xff0c;每次滑动一个字节2. 每一个window里面的5个字节&#xff0c;分别可以N个组成3元组。 例如igram&#xff0c;可以分为&#xff1a;igr iga igm iga igm gra grm gam ram3. 每一个三元组通过一个hash函数&#xff0c;算出来…