• Linux system v 共享内存


    system v 共享内存

    #include <sys/types.h>
    #include <sys/shm.h>
    int shmget(key_t key, size_t size, int shmflg);
    

    建立:进程与共享内存的关联关系

    • key_t key:16进制的非0数字。

      一般有两种方式设置它。

      第一种:调用fotk函数

      第二种:直接使用IPC_PRIVATE

    注意:如果两次调用ftok函数时,参数都一样,那么得到的key_t key是一样的,所以shmget函数的返回值也是一样的,也就是说可以访问同一个共享内存。如果使用IPC_PRIVATE,那么shmget函数的返回值每次都不一样。

    • size:共享内存的大小

    • shmflg:

      • IPC_CREAT
      • IPC_EXCL
      • 用户,组用户,其他用户对这片内存的权限,有9个bit来表示,比如664
    • 返回值:成功返回这片共享内存的标识号;失败返回-1,errno被设置。

    #include <sys/types.h>
    #include <sys/shm.h>
    void *shmat(int shmid, const void *shmaddr, int shmflg);
    
    • shmid:由shmget函数创建的,也就是shmget函数的返回值
    • shmaddr:
      • NULL:让内核去申请内存空间
      • 非NULL:自己用malloc开辟一个空间,让共享内存shmid和这个地址关联上。但是如果不是4K的整数倍,内核会向上或者向下调整。
    • shmflg:
      • SHM_RND:读写
      • SHM_RDONLY:只读
    • 返回值:
      • 成功:返回内存地址
      • 失败:返回(void *) -1
    #include <sys/types.h>
    #include <sys/shm.h>
    int shmdt(const void *shmaddr);
    

    取消进程与共享内存的关联关系

    • shmaddr:shmat的返回值
    • 返回值:成功0;失败-1,并设置errno。
    #include <sys/types.h>
    #include <sys/shm.h> 
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    

    对共享内存操作,更具cmd的不同,对共享内存进行不同的操作。

    • shmid:由shmget函数创建的,也就是shmget函数的返回值
    • cmd:
      • IPC_STAT:得到共享内存的状态
      • IPC_RMID:标记删除共享内存(当共享内存的引用计数变为0时,删除)
      • IPC_SET:设置共享内存的属性(修改权限,修改shmid等)
      • 等等
    • buf:shmid_ds结构体
    • 返回值:当cmd是IPC_RMID时:成功0;失败-1,并设置errno

    用命令【ipcs】可以查看共享内存的状态

    ------ Shared Memory Segments --------
    key        shmid      owner      perms      bytes      nattch     status
    0x00007fff 65536      ys         664        256        0
    0x00007ffe 98305      ys         664        256        0
    0x0000555e 131074     ys         664        256        0
    0x00000011 229379     ys         664        256        3
    
    • key:函数shmget指定的第一个参数
    • shmid:函数shmget的返回值
    • owner:属于哪个用户创建的
    • perms:这个共享内存的访问权限
    • bytes:大小
    • nattch:使用这个共享内存的进程的数量
    • status:共享内存的状态

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    拷贝某文件至某位置
    Java对象的序列化和反序列
    常见的RuntimeException异常有哪些
    array数组增删元素
    失眠怎么办
    构造函数和函数区别(关键的new操作符)
    匿名函数递归(arguments.callee)和命名函数递归
    localeCompare方法在chrome浏览器取值问题
    random()方法
    iframe 父子页面之间取值
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/11259093.html
Copyright © 2020-2023  润新知