作家
登录

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

作者: 来源: 2017-06-19 15:49:28 阅读 我要评论

一、什么是消息队列

消息队列供给了一种年腋荷琐过程向另一个过程发送一个数据块的办法。 每个数据块都被认为含有一个类型,接收过程可以自力地接收含有不合类型的数据构造。我们可以经由过程发送消息来避免定名管道的同步和壅塞问题。然则消息队列与定名管道一样,每个数据块都有一个最大年夜长度的限制。

Linux用宏MSGMAX和MSGMNB来限制一条消息的最大年夜长度和一个队列的最大年夜长度。

二、在Linux中应用消息队列

Linux供给了一系列消息队列的函数接口来让我们便利地应用它来实现过程间的通信。它的用法与其他两个System V PIC机制,即旌旗灯号量和共享内存类似。

1、msgget函数

该函数用来创建和拜访一个消息队列。它的原型为:

int msgget(key_t, key, int msgflg);

与其他的IPC机制一样,法度榜样必须供给一个键来定名某个特定的消息队列。msgflg是一个权限标记,表示消息队列的拜访权限,它与文件的拜访权限一样。msgflg可以与IPC_CREAT做或操作,表示当key所定名的消息队列不存在时创建一个消息队列,如不雅key所定名的消息队列存在时,IPC_CREAT标记会被忽视,而只返回一个标识符。

它返回一个以key定名的消息队列的标识符(非零整数),掉败时返回-1.

2、msgsnd函数

int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);

msgid是由msgget函数返回的消息队列标识符。

msg_ptr是一个指向预备发送消息的指针,然则消息的数据构造却竽暌剐必定的请求,指针msg_ptr所指向的消息构造必定如果以一个长整型成员变量开端的构造体,接收函数将用这个成员来肯定消息的类型。所以消息构造要定义成如许:

  1. struct my_message{   
  2.  
  3.     long int message_type;   
  4.  
  5.     /* The data you wish to transfer*/   
  6.  
  7. };   

msg_sz是msg_ptr指向的消息的长度,留意是消息的长度,而不是全部构造体的长度,也就是说msg_sz是不包含长整型消息类型成员变量的长度。

msgflg用于控制当前消息队列满或队列消息达到体系范围的限制时将要产生的工作。

如不雅调用成功,消息数据的一分副本将被放到消息队列中,并返回0,掉败时返回-1.

3、msgrcv函数

该函数用来年腋荷琐消息队列获撤消息,它的原型为

int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);

msgid, msg_ptr, msg_st的感化也函数msgsnd函数的一样。

msgtype可以实现一种简单的接收优先级。如不雅msgtype为0,就获取队列中的第一个消息。如不雅它的值大年夜于零,将获取具有雷同消息类型的第一个信息。如不雅它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。

IPC_RMID:删除消息队列

msgflg用于控制当队列中没有响应类型的消息可以接收时将产生的工作。

4、msgctl函数

该函数用来控制消息队列,它与共享内存的shmctl函数类似,它的原型为:

int msgctl(int msgid, int command, struct msgid_ds *buf);

command是将要采取的动作,它可以取3个值,

IPC_STAT:把msgid_ds构造中的数据设置为消息队列的当前接洽关系值,即竽暌姑消息队列的当前接洽关系值覆盖msgid_ds的值。

IPC_SET:如不雅过程有足够的权限,就把消息列队的当前接洽关系值设置为msgid_ds构造中给出的值

buf是指向msgid_ds构造的指针,它指向消息队列模式和拜访权限的构造。msgid_ds构造至少包含以下成员:

  1. struct msgid_ds      
  2. {          
  3. uid_t shm_perm.uid;  
  4.         uid_t shm_perm.gid; 
  5.         mode_t shm_perm.mode; 
  6. };    

成功时返回0,掉败时返回-1.

三、应用消息队列进行过程间通信

马一向蹄,介绍完消息队列的定义和可应用的接口之后,我们来看看它是怎么让过程进行通信的。因为可以让不相干的过程进行行通信,所以我们在这老将会编写两个法度榜样,msgreceive和msgsned来表示接收和发送信息。根据正常的情况,我们许可两个法度榜样都可以创建消息,但只有接收者在接收完最后一个消息之后,它才把它删除。

接收信息的法度榜样源文件为msgreceive.c的源代码为:

  1. #include <unistd.h>   
  2.  
  3. #include <stdlib.h>   
  4.  
  5. #include <stdio.h>   
  6.  
  7. #include <string.h>   
     1/5    1 2 3 4 5 下一页 尾页

      推荐阅读

      Windows 10 Build 16215带来的11大Fall Creators Update最佳功能_IT技术周刊第506期

    【义务编辑:刘晶晶 TEL:(010)68476606】 >>>详细阅读


    本文标题:Linux进程间通信——使用消息队列

    地址:http://www.17bianji.com/lsqh/35826.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)