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

  • 相关阅读:
    Ubuntu20.04更换软件源
    使用kubeadm安装k8s1.19版本之系统基础环境配置&k8s集群初始化(二)
    k8s如何删除处于terminating状态的ns资源
    k8s如何强制删除pod&pv&pvc和ns&namespace方法
    C语言中的有符号数和无符号整形数转换
    互联网-架构演进
    结合redis使token失效
    有一种爱叫做放手
    js 读取上传的json文件内容
    使用spark-md5获取文件的MD5值
  • 原文地址:https://www.cnblogs.com/liuchengchuxiao/p/4111664.html
Copyright © 2020-2023  润新知