linux进程通信———Posix消息队列简介及基础库函数

本文介绍了Posix消息队列与管道、FIFO的差异,包括存储特性和生命周期。详细阐述了Posix消息队列与System V消息队列的不同,并讲解了消息队列的基本属性。此外,还列举了如mq_open、mq_close等基础库函数的用法,并通过代码实例展示了如何创建、操作和测试消息队列。
摘要由CSDN通过智能技术生成

linux进程通信———Posix消息队列简介及基础库函数

引言:消息队列可认为是一个消息链表,有足够写权限的线程可向队列中放置消息,有足够读权限的线程可从队列中取走消息。本篇笔记将简要介绍Posix消息队列特性、基本库函数调用。



一、Posix消息队列简介

1.1、与管道、FIFO差异

1)、存储特性:在某个进程往一个消息队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达,但是对管道和FIFO来讲,除非读出者已经存在,否则先有写入者是没有意义的。

管道的缓存大小为一个内存页,需要读写进程协同工作才能充分利用管道的“流通”特性,其本身存储信息能力微弱。但是消息队列是一个链表,可以动态扩展,有存储信息的能力,故其在写数据时,不需要某个进程等待消息到达。

2)、生命周期:管道和FIFO是随进程的持续性,即当一个管道或者FIFO的最后一次关闭发生时,仍在该管道或FIFO的数据将被丢弃。而消息队列具有随内核的持续性,直到内核自举或者显示删除该对象为止。一个进程可以向某个队列中写入一些消息,然后终止,再让另外一个进程在以后某个时刻读取这些消息。

3)、数据类型差异:管道和FIFO是字节流模型,没有消息边界,也没有与每个消息关联的类型,但消息队列数据存在类型。

这里写图片描述
图1、消息队列与管道的差异

1.2、Posix消息队列与System V消息队列的差异

  本篇笔记介绍Posix消息队列,后面还会介绍System V消息队列,这两组函数间存在很多相似性,下面是二者的差别:

1)、读取差异:Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读可以返回任意指定优先级的消息
2)、写入差异:当向一个空队列放置消息时,Posix消息队列允许产生一个信号或启动一个线程,System V则不提供类似机制。

1.3、消息队列的基本属性:

1)、一个无符号整数优先级(Posix)或一个长整数类型(System V)
2)、消息的数据部分长度(可以为0)
3)、数据本身(如果长度大于0,则有数据)

这里写图片描述
图2、含有三个消息的某个Posix消息队列的可能布局

  消息队列可认为是一个消息链表,该链表的头中含有当前队列的两个属性:mq_maxmsg为队列中允许的最大消息数、mq_msgsize为单个消息的容量上限。由于消息队列具有随内核的持续性,于是我们可以编写若干个小程序来使用它,以便深入理解它。


二、基本库函数

  Posix消息队列的基本操作函数包括mq_open、mq_close、mq_unlink、mq_getattr、mq_setattr、mq_send、mq_receive。当然mq是message queue消息队列的缩写,函数依次对应为创建或打开队列、关闭队列、接触链接、获取队列属性、设置队列属性、向队列放置消息、及从队列中取走一个消息。下面对它们依次介绍并附带实例测试。

2.1、mq_open函数:

1)、概述: mq_open()函数创建一个新的消息队列或打开一个已经存在的队列。

这里写图片描述
图3、mq_open函数

2)、参数:

  • const char* name:用于指定队列的名字
  • oflag:是O_RDONLY、O_WRONLY、或O_RDWR之一,可能按位或上O_CREAT、O_EXCL或O_NONBLOCK。
  • mode:用于指定权限位,包括S_IRUSR、S_IWUSR等。
  • attr: attr参数用于给新队列指定属性,如果其为空指针,则使用默认属性。

当实际操作是创建一个新队列,即已指定O_CREAT标志且所请求的消息队列尚未存在,则mode和attr参数是需要的。

3)、返回值: mq_open参数的返回值称为消息队列描述符(message queue descriptor),这个值用于其余7个消息队列函数的第一个参数。若其失败,则返回-1.

2.2、mq_close函数:

1)、概述:已打开的消息队列是由mq_close关闭的,其功能与我们关闭一个word文件类似:调用进程可以不再使用该描述符,但其消息队列并不从系统中删除。当一个进程终止时,它所有打开的消息队列都关闭,就像调用mq_close一样。

这里写图片描述
图4、mq_close函数

2)、参数:

  • mqd_t mqdes:所要关闭消息队列的描述符

3)、返回值:成功关闭返回0,失败返回-1;

2.3、mq_unlink函数:

1)、概述:要从系统中删除用作mq_open第一个参数的某个name,必须调用mq_unlink。当一个消息队列的引用计数仍大于0时,其name就可以删除,但是该队列的析构(拆除队列),要在其引用计数变为0才进行。

我的理解是仅打开该消息队列的进程,可以执行相应的读取写入操作,其他进程已经找不到该消息队列,无法建立连接了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值