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 中没有文件

将一组结构放入unix中的共享内存中,以便客户端程序可以访问它

如何在unix环境下实现共享内存

检查linux中消息队列和共享内存状态的命令?

UNIX网络编程:共享内存区