linux共享内存之mmap

这应该可以算得上是IPC的一种,虽然效率可能并没有其它IPC方式高.

看到map很容易联想到映射.的确,mmap就是一种映射方式,将打开的文件和一段连续的内存做映射.使得对内存进行操作即可以实现对文件的读写,反过来,也就是说,可以通过这种方式来达到进程通信.

mmap系列涉及三个函数.

void * mmap(void *buf, size_t len, int prot, int flag, int fd, off_t offset);

此函数建立一个共享内存,prot即为权限,可选值有PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE.顾名思义,就不多说了.

flag即为共享内存作用范围.部分可取值为MAP_SHARED(进程共享,即当做出了修改,会写回到文件), MAP_PRIVATE(私有,即不会影响到文件), MAP_FIXED(一般情况下,buf参数置为NULL,由系统来分配地址,但是如果指定了这个字段,buf不能为空,否则core dump).

int msync(void *buf, size_t len, int flags);

此函数同步共享内存与文件的值,flags可取如下值,MS_ASYNC(同步), MS_SYNC(异步), MS_INVALIDATE(从文件中读回数据).

munmap(void* buf, size_t len);

此函数关闭共享内存.

使用这些常用的选项写一个简单的小程序.

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>

typedef struct
{
    int integer;
    char string[24];
}RECORD;

#define NRECORD 5

int main(int argc, char ** argv)
{
    RECORD *mapped;
    int i, f;

    f = open("record.dat", O_RDWR);
    mapped = (RECORD*)mmap(0, sizeof(RECORD) * NRECORD, PROT_READ | PROT_WRITE, MAP_SHARED, f, 0);

    printf("********************first of all***********************\n");
    for (i = 0; i < NRECORD; i++)
    {
        printf("record (%d) is %s\n", (mapped + i)->integer, (mapped + i)->string);
        (mapped + i)->integer += 100;
        snprintf((mapped + i)->string, 24, "RECORD-%d", (mapped + i)->integer);
    }

    msync((void *)mapped, sizeof(RECORD) * NRECORD, MS_INVALIDATE);   //MS_INVALIDATE MS_ASYNC MS_SYNC 这三个宏都可以达到更新文件的效果.不晓得三者的区别.

    printf("********************second of all***********************\n");
    for (i = 0; i < NRECORD; i++)
    {
        printf("record (%d) is %s\n", (mapped + i)->integer, (mapped + i)->string);
        (mapped + i)->integer += 100;
        snprintf((mapped + i)->string, 24, "RECORD-%d", (mapped + i)->integer);
    }
    msync((void*)mapped, sizeof(RECORD) * NRECORD, MS_ASYNC);

    printf("********************third of all***********************\n");
    for (i = 0; i < NRECORD; i++)
    {
        printf("record (%d) is %s\n", (mapped + i)->integer, (mapped + i)->string);
        (mapped + i)->integer += 100;
        snprintf((mapped + i)->string, 24, "RECORD-%d", (mapped + i)->integer);
    }

    munmap((void*)mapped, sizeof(RECORD) * NRECORD);

    return 0;
}

这三个函数在对文件进行操作的时候,其实优点还是很明显的.但是说到用来共享内存,相信这绝对不是一个好的选择.

时间: 2024-10-06 14:57:39

linux共享内存之mmap的相关文章

linux 共享内存实现

说起共享内存,一般来说会让人想起下面一些方法:1.多线程.线程之间的内存都是共享的.更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享:2.父子进程间的内存共享.父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其子孙进程之间就能共享这块内存.这种共享内存由于受到进程父子关系的限制,一般较少使用:3.mmap文件.多个进程mmap到同一个文件,实际上就是大家在共享文件page cache中的内存.不过文件牵涉到

一张图深度解析Linux共享内存的内核实现

一张图深度解析Linux共享内存的内核实现 Sailor_forever  sailing_9806#163.com http://blog.csdn.net/sailor_8318/article/details/39484747 (本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途.任何个人.媒体.其他网站不得私自抄袭:网络媒体转载请注明出处,增加原文链接,否则属于侵权行为.如有任何问题,请留言或者发邮件给sailing_9806#163.com)

linux 共享内存shm_open实现进程间大数据交互

linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> #include <string.h> #include <errno.h> #include <unistd.h> /* int

【转】Linux共享内存编程实例

原文地址:http://blog.csdn.net/pcliuguangtao/article/details/6526119 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6

Linux共享内存使用常见陷阱与分析 - 51CTO.COM http://os.51cto.com/art/201311/418977_all.htmIPC---共享内存

共享内存就是允许两个或多个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据时,不需要在客户进程和服务器进程之间幅值,因此是最快的一种IPC.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 注意:共享内存并未提供同步机制,也就是说,

unix/linux共享内存应用与陷阱

unix/linux共享内存应用与陷阱 (2012-06-12 14:32) 标签:  linux  内存  分类: linux应用  共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做.一.应用共享内存的使用,主要有以下几个API:ftok().shmget().shmat().shmdt(

共享内存之——mmap内存映射

共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过systemV共享内存机制实现.应用接口和原理很简单,内部机制复杂.为了实现更安全通信,往往还与信号灯等同步机制共同使用. 这一篇详解mmap内存文件映射原理及其案例,system V共享内存 以及他们的区别将在后面的随笔中讨论. 非原创,内容源于互联网 mmap内存文件映射 一.传统文件访问 unix

linux共享内存

1) 用ftok()函数获得一个ID号.2) shmget()用来开辟/指向一块共享内存的函数3) shmat()将这个内存区映射到本进程的虚拟地址空间.4) shmdt()函数删除本进程对这块内存的使用5) shmctl() 控制对这块共享内存的使用 1) mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存.普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作2) 系统调用munmap()在进程地址空间中解除一个

Linux共享内存(一)

inux系统编程我一直看 <GNU/LINUX编程指南>,只是讲的太简单了,通常是书和网络上的资料结合着来掌握才比较全面 .在掌握了书上的内容后,再来都其他资料 . 原文链接 http://www.cnblogs.com/skyme/archive/2011/01/04/1925404.html 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区