zoukankan      html  css  js  c++  java
  • UNIX C XSI_IPC对象、共享内存

    1.创建IPC对象

      

    #include <sys/ipc.h>
    
    key_t ftok(const char* pathname,int proj_id);
    
    成功返回可用于创建或获取IPC的键,失败则返回-1

    2.创建、获取共享内存

    #include <sys/shm.h>
    
    int shmget(key_t key,size_t size,int shmflg);
    
    成功返回共享内存标志符,失败返回-1
    
    --key:共享内存键
    --size:共享内存大小
    --shmflg:创建标志,可取以下值
        0  -获取,不存在即失败
        IPC_CREAT -创建,不存在即创建,已存在即获取
        IPC_EXCL -排斥,已存在即失败

     

    3.加载共享内存

    #include <sys/shm.h>
    
    void* shmat(int shmid,const void* shmaddr,int shmflg);
    
    成功返回共享内存起始地址,失败返回-1
    
    --shmid:共享内存标志符
    
    --shmaddr:指定映射地址,可置NULL,由系统自动选择
    
    --shmflg:加载标志
        
        0 -以读写方式使用共享内存
        SHM_RDONLY - 以只读方式使用共享内存
        SHM_RND  - 只在shmaddr参数非NULL时起作用

    4.卸载共享内存

    #include <sys/shm.h>
    
    int shmdt(const void* shmaddr);
    
    成功返回0,失败返回-1
    
    --shmaddr:共享内存起始地址

    5.销毁/控制共享内存

    #include <sys/shm.h>
    
    int shmctl(int shmid,int cmd,struct shmid_ds* buf);
    
    成功返回0,失败返回-1
    
    --shmid:共享内存标志符
    --cmd:控制命令,可取以下值
        IPC_STAT -获取共享内存的属性,通过buf参数输出
        IPC_SET -设置共享内存的属性,通过buf参数输入,仅以下三个属性可以设置
        
        shmid_ds::shm_perm.uid//拥有者用户ID
        shmid_ds::shm_perm.gid//拥有者组ID
        shmid_ds::shm_perm.mode//权限
        IPC_RMID -销毁共享内存。不是真的销毁,只是做个销毁标记,禁止任何进程对该共享内存形成新的加载
    -buf:shmid_ds类型的共享内存属性结构

    6.消息队列

      创建/获取消息队列

    #include <sys/msg.h>
    
    int msgget(key_t key,int msgflg);
    
    成功返回消息队列标志符,失败返回-1
    
    -key:消息队列键
    -msgflg:创建标志,可取以下值
    0    -获取,不存在即失败
    IPC_CREAT :创建,不存在即失败
    IPC_EXCL -排斥,已存在即失败

      发送消息

    #include <sys/msg.h>
    
    int msgsnd (int msqid,const void* msgp,size_t msgsz,int msgflg);
        
    成功返回0,失败返回-1
    
    -msqid:消息队列标志符
    -msgp:指向一个包含消息类型和消息数据的内存块。
    -msgsz:期望发送消息数据的字节数
    -msgflg :发送标志,一般取0即可

      接收消息

    #include <sys/msg.h>
    
    ssize_t msgrcv (int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg);
    
    成功返回所接收消息数据的字节数,失败返回-1
    
    --msqid:消息队列标志符
    --msgp:指向一块包含消息类型(4字节)和消息数据的内存
    --msgsz :期望接收消息数据的字节数

      销毁或控制消息队列

    #include <sys/msg.h>
    
    int msgctl(int msqid,int cmd,struct msqid_ds* buf);
    成功返回0,失败返回-1
    
    -msqid:消息队列标志符
    
    --cmd:控制命令,可取以下值
     IPC_STAT -获取共享内存的属性,通过buf参数输出
        IPC_SET -设置共享内存的属性,通过buf参数输入,仅以下三个属性可以设置
        
        shmid_ds::shm_perm.uid//拥有者用户ID
        shmid_ds::shm_perm.gid//拥有者组ID
        shmid_ds::shm_perm.mode//权限
        IPC_RMID -销毁共享内存。不是真的销毁,只是做个销毁标记,禁止任何进程对该共享内存形成新的加载
    -buf:shmid_ds类型的共享内存属性结构
    
    

      

    7.信号量

      创建获取信号量集

    #include <sys.sem.h>
    
    int semget (key_t key,int nsems,int semflg);
    
    成功返回信号量集标志符,失败返回-1
    
    -key :信号量集键
    -nsems:信号量个数
    -semflg:创建标志,可取以下值
        0 -获取,不存在即创建,已存在即获取
        IPC_CREAT -创建,不存在即创建,已存在即获取
        IPC_EXCL -排斥,已存在即失败

      

      操作信号量集

    #include <sys.sem.h>
    
    int semop(int semid,struct sembuf* sops,unsigned nsops);
    
    成功返回0,失败返回-1
    
    -semid:信号量集标志符
    -sops:操作结构体数组
    -nsops:操作结构体数组的长度
    
    struct sembuf{
        unsigned short sem_num;//信号量编号
        short     sem_op;//操作数
        short     sem_flg;//操作标志
    };

      销毁控制信号量集

    #include <sys/sem.h>
    
    int semctl(int semid,int semnum,int cmd,....);
    
    成功返回0(cmd取某些值时存在例外),失败返回-1
    
    -semid:信号量集标志符
    -semnum:信号量编号
    -cmd:控制命令
  • 相关阅读:
    【CF1523E】Crypto Lights
    【洛谷P3228】数列
    【洛谷P4319】变化的道路
    Educational Codeforces Round 110
    【洛谷P2444】病毒
    一、Java语言基础(1)_走进java——第一个java程序
    android studio 调试smali
    Kickstart Round B 2018
    Proj THUDBFuzz Paper Reading: A Review of Machine Learning Applications in Fuzzing
    Proj THUDBFuzz Paper Reading: Fuzzing: Hack, Art, and Science
  • 原文地址:https://www.cnblogs.com/Kernel001/p/7810968.html
Copyright © 2011-2022 走看看