UNIX环境高级编程:存储映射I/O(mmap函数)
flags使用如下的常值指定。MAP_SHARED或MAP_PRIVATE这两个标志必须指定一个,并可有选择的或上MAP_FIXED。如果指定了MAP_PRIVATE,那么调用进程被映射数据所作的修改只对该进程可见,而不改变其底层支撑对象(或者是一个文件独享,或者是一个共享内存区对象)。如果指定了MAP_SHARED,那么调用进程对被映射数据所作的修改对于共享该对象的所有进程都可见,而且确实改变了其底层支撑对象。 mmap成功返回后,fd参数可以关闭。该操作对于由mmap建立的映射关系没有影响。 为从某个进程的地址空间删除一个映射关系,我们调用munmap。 #include <sys/mman.h> int munmap(void *addr,szie_t len); 其中addr参数由mmap返回的地址,len是映射区的大小。再次访问这些地址将导致向调用进程产生一个SIGSEGV信号(当然这里假设以后的mmap调用并不重用这部分地址空间)。 如果被映射区是使用MAP_PRIVATE标志映射的,那么调用进程对它所作的变动都会被丢弃掉,即不会同步到文件中。 注意:进程终止时,或调用munmap之后,存储映射区就被自动解除映射。关闭文件描述符fd并不解除,munmap不会影响被映射的对象,在解除了映射之后,对于MAP_PRIVATE存储区的修改被丢弃。 内核的虚拟内存算法保持内存映射文件(一般在硬盘上)与内存映射区(在内存中)的同步,前提是它是一个MAP_SHARED内存区。这就是说,如果我们修改了处于内存映射到某个文件的内存区中某个位置的内容,那么内核将在稍后的某个时刻相应的更新文件。然而有时候我们希望确信硬盘上的文件内容与内存映射区中的内容一致,于是调用msync来执行这种同步。 #include <sys/mman.h> int msync(void *addr,size_t len,int flags); 其中addr和len参数通常指代内存中的整个内存映射区,不过也可以指定该内存区的一个子集。flags参数如下所示的各常值的组合。 MS_ASYNC和MS_SYNC这两个常值中必须指定一个,但不能都指定。他们的差别是,一旦写操作已由内核排入队列,MS_ASYNC即返回,而MS_SYNC则要等到写操作完成后才返回。如果指定了MS_INVALIDATE,那么与其最终副本不一致的文件数据的所有内存中副本都失效。后续的引用将从文件中取得数据。 为何使用mmap (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |