#系统编程--消息队列

一、IPC对象

除了最原始的进程间通信方式信号、无名管道和有名管道外,还有三种进程间的通信方式,这三种方式称之为IPC对象,分别为:消息队列、共享内存、信号灯集。

IPC对象也是在内核空间开辟区域,每一种IPC对象创建好之后都会将其设置为全局,并且会给其分配一个编号,只要找到唯一的这个编号就可以进行通信,所以不相关的进程可以通过IPC对象通信。

IPC对象创建好之后,会在当前系统中可见,只要不删除或者不关闭系统,就会一直存在。

查看已经创建的IPC对象:

1、ipcs查看当前系统中所有的IPC对象

2、ipcs -q查看穿件的消息队列

3、ipcs -m查看创建的共享内存

4、ipcs -s查看信号量

5、ipcrm 删除IPC对象:比如:ipcrm -q msqid 删除标号为msqid的消息队列

#系统编程--消息队列_第1张图片

二、消息队列概述

2.1消息队列的概念

消息队列都是消息的链表,存放在内存中,由内核维护。

消息队列的格式:

typedef struct _msg{

        long mtype;    //消息类型 必须长整型

        char mtext[100];   //消息正文 (当前结构体的大小减去消息类型的大小)

}MSG;

消息队列的特点:

1、消息队列中的消息是有类型的。

2、消息队列中的消息是有格式的。

3、消息队列可以实现消息的随机查询,消息队列不一定要以先进先出的次序读取,编程时可以按消息的类型读取。

4、消息队列允许一个或者多个进程向它写入或者读取消息。

5、与无名管道、有名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除

6、每个消息队列都有消息队列标识,消息队列的标识符在整个系统中唯一的。

7、只有内核重启或人工删除消息队列时,该消息队列才会被删除,若不人工删除消息队列,消息队列会一直存在系统中。

System V提供的IPC通信机制需要一个key值,通过key值就可在系统内获得唯一的消息队列标识符。key值可以是人为指定的,也可以通过ftok函数获得。

如果多个进程向通过IPC对象通信,则必须找到唯一的标识,而唯一的标识由key值决定,所以只要key知道,就可以实现多个

2.2ftok

#系统编程--消息队列_第2张图片

key值获取:

#系统编程--消息队列_第3张图片

3.1创建消息队列--msgget:

#系统编程--消息队列_第4张图片

#系统编程--消息队列_第5张图片

执行结果:

#系统编程--消息队列_第6张图片

3.2发送消息

#系统编程--消息队列_第7张图片

#系统编程--消息队列_第8张图片

#系统编程--消息队列_第9张图片

执行结果:

#系统编程--消息队列_第10张图片

3.3接收消息

#系统编程--消息队列_第11张图片

#系统编程--消息队列_第12张图片

#系统编程--消息队列_第13张图片

你可能感兴趣的:(linux,c语言,物联网)