Linux消息队列实现进程间通信实例详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux消息队列实现进程间通信实例详解
Linux消息队列实现进程间通信实例详解
⼀、什么是消息队列
消息队列提供了⼀种从⼀个进程向另⼀个进程发送⼀个数据块的⽅法。

每个数据块都被认为含有⼀个类型,接收进程可以独⽴地接收含有不同类型的数据结构。

我们可以通过发送消息来避免命名管道的同步和阻塞问题。

但是消息队列与命名管道⼀样,每个数据块都有⼀个最⼤长度的限制。

Linux⽤宏MSGMAX和MSGMNB来限制⼀条消息的最⼤长度和⼀个队列的最⼤长度。

⼆、在Linux中使⽤消息队列
Linux提供了⼀系列消息队列的函数接⼝来让我们⽅便地使⽤它来实现进程间的通信。

它的⽤法与其他两个System V PIC机制,即信号量和共享内存相似。

进程间通信(IPC):进程间通信的本质就是通过让不同的进程看到⼀份公共的资源来实现通信。

常⽤的进程间通信的⽅式有两种:通过管道和systemv标准,今天我们来介绍systemv标准中的⼀种:消息队列
消息队列:消息队列提供了⼀种从⼀个进程向另⼀个进程发送⼀个数据块的⽅法,每个数据块都认为是有⼀个类型,接受者进程接收的数据块可以有不同的类型值。

我们可以通过发送消息来避免命名管道的同步和阻塞问题。

特点:
(1)消息队列可认为是全局的⼀个链表,由消息队列标识符进⾏标识。

(2)消息队列允许⼀个或多个进程写⼊或读取消息
(3)消息队列的声明周期随内核
(4)消息队列可以实现双向通信
创建⼀个消息队列:msget()
第⼀个参数:每⼀个消息队列都有唯⼀的key值,可以由ftok()产⽣
第⼆个参数:⼀般由两个选项IPC_CREAT和IPC_EXCL,单独使⽤ipc_creat时,如果消息队列不存在则创建⼀个,如果存在则打开 IPC_EXCL 如果同时使⽤,如果消息队列不存在则创建之,如果存在则出错返回。

当单独使⽤IPC_EXCL时,没有意义。

ftok:
参数可由⽤户指定。

下⾯⽤代码实现消息队列的创建:
在创建⼀个消息队列(其他ipc相同)时,需要先通过⽂件路径名和项⽬ID获取⼀个键值,然后通过此键值由内核⽣成标识符,在以后可通过此标识符来使⽤此消息队列。

为什么要有key值和标识符两个值呢?
描述符是对于⽤户操作⽽⾔的,让⽤户感觉操作和对⽂件的操作相同,key是对于系统内部说的。

我们使⽤ftok来创建key值,具体可以man⼀下fotk函数,⼤概是这样的:按给定的路径名取得其stat结构,从该结构中取出部分st_dev和st_ino字段,然后再与项⽬id组合起来,如果两个路径名引⽤两个不同的⽂件,那么,对这两个路径名调⽤ftok通常返回不同的key值,但是,因为i节点号和key通常都存放在长整型中,于是创建key时可能会丢失信息,这意味着,如果使⽤同⼀项⽬id,那么对于不同⽂件的两个路径名可能产⽣相同的key值。

⽽标识符是唯⼀确定的,可以⽤来区别于其他ipc的。

删除消息队列:msgctl()
代码实现:
发送消息:msgsnd()
接收消息:magrcv(),这两个函数实现进程间的双向通信
参数:msqid-消息队列标识码
msgp-指向消息缓冲区的指针,此位置是⽤来暂时存储发送和接收的消息,是⼀个⽤户可定义的通⽤结构。

msgtyp-从消息队列内读取的消息形态。

如果值为0,则表⽰消息队列中,所有消息被读取。

msgsz:消息的⼤⼩
返回值:成功返回0,失败则返回-1.
那么如何查看系统中正在运⾏的消息队列呢?
介绍两个命令:ipcs -q 查看消息队列
ipcrm -q msgid 删除此消息队列
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

相关文档
最新文档