进程间通信——消息队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通信——消息队列相关的知识,希望对你有一定的参考价值。

概念

  • 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,每个数据块都被认为是有一个类型,接收者进程接受的数据块可以有不同的类型值。

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

  • 消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。

  • 消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数是有上限的(MSGMNB),系统上消息队列总数也有一个上限(MSGMNI)。


IPC对象数据结构

  • 内核为每个IPC对象维护一个数据结构(/usr/include/linux/ipc.h)。

    消息队列、信号量、共享内存都有这样一个共同的数据结构。

    技术分享


消息队列结构

技术分享

  • 第一个条目就是IPC结构体,后面的都是消息队列的私有成员。

  • 消息队列是用链表实现的。


函数

  • msgget

msgget系统调用创建一个消息队列,或者获取一个已有的消息队列。定义如下:

技术分享

key:可以认为是一个端口号,也可以由函数ftok生成。

msgflgIPC_CREAT(创建一个IPC资源,否则打开操作)。

               IPC_EXCL(只有在IPC资源不存在的时候,新的IPC资源才建立,否则就产生错误)。IPC_EXCL标志本身没有太大意义,但是和IPC_CREAT一起使用可以用来保证所得对象是新建的,而不是已打开的对象。

   如果单独使用IPC_CREATmsgget()要么返回一个已经存在的消息队列的操作符,要么返回一个新建的消息队列的描述符。

   如果将IPC_CREATIPC_EXCL标志一起使用,msgget()将返回一个新建的IPC标识符;如果该IPC资源已经存在,返回-1。

  • msgsnd

   msgsnd系统调用把一条消息添加到消息队列中。定义如下:

技术分享

  msqid参数是由msgget调用返回的消息队列标识符。

  msgp参数指向一个准备发送的消息,消息必须被定义为如下类型

技术分享

msgsz参数是消息的数据部分(mtext)的长度。

msgflg:控制msgsnd的行为,通常仅支持IPC_NOWAIT标志,即以非阻塞的方式发消息。默认情况下(msgflg为0),发送消息时如果消息队列满了,则msgsnd将阻塞。若IPC_NOWAIT标志被指定,则msgsnd将立即返回-1并设置errno为EAGAIN。

msgsnd成功时返回0,失败时返回-1并设置errno。

  • msgrcv

msgrcv系统调用从消息队列中获取消息。定义如下:

技术分享

msqid参数是由msgget返回的消息队列标识符。

msgp参数用于存储接收的信息。

msgsz参数指的是消息数据部分的长度。

msgtyp参数指定接收何种类型的消息,如果为0,表示消息队列中的所有消息都会被读取。

msgflg参数控制msgrcv的行为,如果为0,当消息队列中没有消息时,采取阻塞等待的处理模式。IPC_NOWAIT 如果消息队列中没有消息,则msgrcv立即返回并设置errno为 ENOMSG。

msgrcv成功时返回0,失败时返回-1并设置errno。

  • msgctl

msgctl系统调用控制消息队列的某条属性。定义如下:

技术分享

msqid参数是由msgget调用返回的共享内存标识符。

cmd参数指定要执行的命令

技术分享

msgctl成功时的返回值取决于cmd参数,失败时返回-1并设置errno。


代码

  • 消息队列


    



本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1851118

以上是关于进程间通信——消息队列的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程间通信——消息队列

进程间通信——消息队列

多进程编程之进程间通信-管道和消息队列

Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!

Linux间进程通信--消息队列

Linux间进程通信--消息队列