UNIX下C语言----消息队列

一、IPC系统简介

IPC就是进程间通信(Interprocess Communication),广义上讲一切能使进程间相互交流的对象和方法都是IPC,比如文件、管道、SOCKET等。狭义上讲IPC特指消息队列、信号量和共享内存三种对象,其中消息队列应用于不同进程之间少量数据的顺序共享,信号量应用于进程之间的同步与互斥的控制,共享内存则应用于进程之间大批量数据的随机共享访问。

1.查询IPC对象

 ipcs [options]

参数options的常见选择: -q 只查询消息队列IPC对象 -s 只查询信号量IPC对象 -m 只查询共享内存IPC对象 -a 查询IPC对象的全部属性 默认 查询消息队列、信号量和共享内存的基本属性,类似于"-qsm"

 

IPC对象公共属性

列名 含义 T IPC对象类型,"q"、"s"、"m"分别表示消息队列、信号量和共享内存 ID IPC对象的标识符 KEY IPC对象的关键字 MODE IPC对象的访问权限、与文件的访问权限类似 OWNER IPC对象的属主 GROUP IPC对象的属组 CREATOR IPC对象的创建者 CGROUP IPC对象创建的归属组 CTIME IPC对象的修改时间 ------------------------------ 消息队列专有属性 CBYTES 消息队列中已使用的字节数 QNUM 消息队列中当前存储的消息数 QBYTES 消息队列可容纳的最大字节数 LSPID 最后发送消息的进程号 STIME 最后发送消息的时间 LRPID 最后接受信息的进程号 RTIME 最近接受消息的时间 ------------------------------- 信号量专有属性 NSEMS 信号量集合中的信号数 OTIME 信号最近操作时间 -------------------------------- 共享内存专有属性 SEGSZ 共享内存大小,单位字节 CPID 创建共享内存的用户ID LPID 共享内存最近一次操作的用户ID ATME 共享内存最近一次映射的时间 DTIME 共享内存最近一次取消映射时间

 

2、IPC结构

IPC对象存在一些共同的属性,如关键字、标识符和访问权限等,unix系统一般采用ipc_perm结构来存储,该结构定义在头文件"sys/ipc.h"中

/*----IPC对象ipc_perm结构----*/ struct ipc_perm { uid_t uid;/*IPC对象属主的ID*/ gid_t gid; /*IPC对象属组的ID*/ uid_t cuid;/*IPC对象创建者的ID*/ gid_t cgid;/*IPC对象创建组的ID*/ mode_t mode;/*IPC对象的范围权限*/ unsigned short seq;/*槽位使用序列号*/ key_t key; /*IPC关键字*/ };

 

二、消息队列简介

消息队列是一种先进先出的队列型数据结构,它实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。

多个进程可以同时向一个消息队列发送消息,也可以同时从一个消息队列中接受消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列删除。

 

 1.消息队列结构

UNIX内核采用结构msqid_ds来管理消息队列,它的数据成员与命令"ipcs -a -q"中显示的结果一一对应

 /*-----消息队列msqid_ds结构-----*/ struct msqid_ds { struct ipc_perm msg_perm; /*消息队列的访问权限*/ struct msg* msg_first; /*队列中指向第一个消息的指针*/ struct msg* msg_last; /*队列中指向最后一个消息的指针*/ msgqnum_t msg_qnum; /*队列当前的消息个数*/ unsigned short msg_cbytes; /*队列当前的消息个数*/ msglen_t msg_qbytes;/*队列当前的消息字节数*/ pid_t msg_lspid;/*最后发送消息的进程号*/ pid_t msg_lrpid; time_t msg_stime;/*最后发送消息的时间*/ time_t msg_rtime; time_t msg_ctime; /*最近修改消息队列的时间*/ };

 

消息队列中的各个消息存储在结构为msg结构的空间中,它们组成一个线性的消息链表,其中msqid结构成员msg_first和msg_last分别指向这个链表的表头和表尾的指针。结构msg的定义如下:

/*-----消息msg结构---*/ struct msg { struct msg* msg_next; /*指向消息队列中下一条消息*/ long msg_type; /*本条消息的类型*/ short msg_ts; /*本条消息的长度*/ short msg_spot; /*本条消息的数据地址*/ }; 理论上可以通过msgid_ds成员msg_fist 和msg_last以及结构msg中的msg_next遍历消息队列并完成管理和维护消息队列的功能,但实际上这3个成员是UNIX内核的直辖数据,用户无权使用。

 

 

 2.消息结构

消息队列中消息本身由消息类型和消息数据组成,

/*******消息结构模板**************/ struct msgbuf { long mtype; /*消息类型*/ char mtext[1]; /*消息数据*/ };

 

1)消息类型:成员mtype执行了消息类型,它的取值为正整数。消息类型的引入,可以在更大程度上复用消息队列。通常,我们可以把不同功能消息,分别定义为不同的消息类型,这样子就可以共享同一个消息队列了。

 

例如:某银行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构,c,unix,struct,存储,语言)