• Linux 进程间通信


         共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址

     

    以下是使用共享内存机制进行进程间通信的基本操作:

    需要包含的头文件:

    #include <sys/types.h>

    #include <sys/ipc.h>

    #include <sys/shm.h>

    1.创建共享内存:

     int shmget(key_t key,int size,int shmflg);

    参数说明:

    key:用来表示新建或者已经存在的共享内存去的关键字。

    size:创建共享内存的大小。

    shmflg:可以指定的特殊标志。IPC_CREATE,IPC_EXCL以及低九位的权限。

    eg:

    int shmid;

    shmid=shmget(IPC_PRIVATE,4096,IPC_CREATE|IPC_EXCL|0660);

    if(shmid==-1)

    perror("shmget()");

     

    2.连接共享内存

    char *shmat(int shmid,char *shmaddr,int shmflg);

    参数说明

    shmid:共享内存的关键字

    shmaddr:指定共享内存出现在进程内存地址的什么位置,通常我们让内核自己决定一个合适的地址位置,用的时候设为0。

    shmflg:制定特殊的标志位。SHM_RDONLY:为只读模式,其他为读写模式,一般为0。

    eg:

    int shmid;

    char *shmp=shmat(shmid,0,0);

    if(shmp==(char *)(-1))

    perror("shmat() ");

    3.使用共享内存

    在使用共享内存是需要注意的是,为防止内存访问冲突,我们一般与信号量结合使用。

    4.分离共享内存:

        当程序不再需要共享内后,我们需要将共享内存分离以便对其进行释放,分离共享内存的函数原形如下:

    int shmdt(char *shmaddr);


     

    5. 释放共享内存

    int shmctl(int shmid,int cmd,struct shmid_ds *buf);

  • 相关阅读:
    POJ 1741 Tree(树分治)
    HDU 2196 Computer(树形dp)
    2015沈阳区域赛Meeting(最短路 + 建图)
    make the fence great again(dp 二维)
    2017沈阳区域赛Infinite Fraction Path(BFS + 剪枝)
    bitset详解
    2016青岛区域赛.Coding Contest(费用流 + 概率计算转换为加法计算)
    2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)
    poj-1664.放苹果.(递推)
    hdu-4738.Caocao's Bridges(图中权值最小的桥)
  • 原文地址:https://www.cnblogs.com/liuchengchuxiao/p/4111664.html
Copyright © 2020-2023  润新知