zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    js正则表达式常见规则整理
    struts2标签 遍历map集合
    RabbitMQ面试问题
    vue基础学习
    flowableの历史查询
    flowableの日志打印
    flowableのID生成器
    flowableの流程发起人
    SpringBoot+Dubbo(XML配置方式)
    linux安装zookeeper伪分布式
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/11259093.html
Copyright © 2011-2022 走看看