UNIX C XSI_IPC对象共享内存
Posted Kernel001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:控制命令
以上是关于UNIX C XSI_IPC对象共享内存的主要内容,如果未能解决你的问题,请参考以下文章
删除类 UNIX 系统上的所有 SYSTEM V 共享内存和信号量
df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件