zoukankan      html  css  js  c++  java
  • System V 共享内存区

    System V 共享内存信息结构
    struct shmid_ds {
    struct ipc_perm shm_perm; // operation permission struct
    size_t shm_segsz; // segment size
    pid_t shm_lpid; // pid of last operation
    pid_t shm_cpid; // creator pid
    shmatt_t shm_nattach; // current # attached
    shmat_t shm_cnattach; // in-core # attached
    time_t shm_atime; // last attach time
    time_t shm_dtime; // last detach time
    time_t shm_ctime; // last change time of this structure
    }

    1)
    shmget函数创建一个尚未存在的共享内存区,或者访问一个已存在的共享内存区
    #include <sys/ipc.h>
    #include <sys/shm.h>
    int shmget(key_t key, size_t size, int shmflg)
    key: IPC_PRIVATE,或者ftok返回的IPC键值
    size:新建的共享内存大小,以字节为单位,只获取共享内存时指定为0
    shmflg: 0,取共享内存标识符,若不存在则函数会报错;
    IPC_CREAT,当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
    IPC_CREAT | IPC_EXCL,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存,如果存在这样的共享内存则报错
    错误代码:
    EINVAL:参数size小于SHMMIN或大于SHMMAX
    EEXIST:预建立key所指的共享内存,但已经存在
    EIDRM:参数key所指的共享内存已经删除
    ENOSPC:超过了系统允许建立的共享内存的最大值(SHMALL)
    ENOENT:参数key所指的共享内存不存在,而参数shmflg未设IPC_CREAT位
    EACCES:没有权限
    ENOMEM:核心内存不足

    2)
    shmat连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间
    #include <sys/types.h>
    #include <sys/shm.h>
    void *shmat(int shmid, const void *shmaddr, int shmflg)
    shmaddr: 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置
    shmflg:SHM_RDONLY为只读模式,其他为读写模式
    错误代码:
    EACCES:无权限以指定方式连接共享内存
    EINVAL:无效的参数shmid或shmaddr
    ENOMEM:核心内存不足

    3)
    shmdt断开与共享内存附加点的地址,禁止本进程访问此片共享内存
    #include <sys/types.h>
    #include <sys/shm.h>
    int shmdt(const void *shmaddr)
    错误代码:
    EINVAL:无效的参数shmaddr

    4)
    shmctl共享内存管理
    #include <sys/types.h>
    #include <sys/shm.h>
    int shmctl(int shmid, int cmd, struct shmid_ds *buf)
    cmd:
    IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
    IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
    IPC_RMID:删除这片共享内存
    错误代码:
    EACCESS:参数cmd为IPC_STAT,确无权限读取该共享内存
    EFAULT:参数buf指向无效的内存地址
    EIDRM:标识符为shmid的共享内存已被删除
    EINVAL:无效的参数cmd或shmid
    EPERM:参数cmd为IPC_SET或IPC_RMID,却无足够的权限执行

  • 相关阅读:
    视频笔记
    【LeetCode】给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
    getopt函数用法
    一些常用的算法库
    c语言结构体
    C语言中time_t数据类型详细介绍
    c语言 static的用法
    C语言中extern的用法
    MATLAB textread函数
    正则表达式
  • 原文地址:https://www.cnblogs.com/paullam/p/3753417.html
Copyright © 2011-2022 走看看