Linux进程通信之消息队列

这篇具有很好参考价值的文章主要介绍了Linux进程通信之消息队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.消息队列的原理:

2.消息队列的接口:

        (1)创建消息队列

        (2)向消息队列发送消息

        (3)接收消息

         (4)操作消息队列的接口


1.消息队列的原理:

消息队列(messagequeue)以链表作为基础,实现消息队列,由操作系统维护该链表

操作系统中,使用消息队列描述符(qid)来区分每个消息队列(qid是唯一的)

进程在消息队列的末尾增加消息,需要信息的进程按照所需的类型在队列中取消息

Linux进程通信之消息队列

2.消息队列的接口:

(1)创建消息队列

Linux进程通信之消息队列

        int megget(key_t,int msgflg)

参数: 

key:消息队列的标识符

megflg:创建的标志,如IPC_CREAT

IPC_CREAT :如果不存在就创建,按位或上一个权限

返回值:

成功:返回队列ID

失败:返回-1,并设置erron 

2)向消息队列发送消息      

Linux进程通信之消息队列

 

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)

参数:

msqid:消息队列的ID

msgp:指向msgbuf的指针,用来发送指定的消息,在写msgsnd、msgrev函数时,要提前定义该结构体,主要是指定mtext大小。

      msgp指向的msgbuf为发送的结构体,操作系统指定了函数发送消息的格式,只定义了一部分,mtext可以由程序员自己改变。

Linux进程通信之消息队列

 msgsz:要发送的消息的长度,该参数的值不是表示msgp指向的msgbuf结构体的大小,而是该结构体中mtext的大小。

msgflg:创建标记,如果指定了IPC_NOWAIT,失败会立即返回。       

         0:阻塞发送

         IPC_NOWAIT:非阻塞发送

返回值:

        0:成功

        -1:失败,并设置errno

(3)接收消息

ssize_t msgrcv(int msqid , void *msgp,size_t msgsz,long msgtyp,int msgflg)

参数:

msgid:消息队列的ID

msgp:指向msgbuf的指针,用来接收消息

**struct  msgbuf{……}为输出型参数

msgsz:需要接受的消息的长度,注意msgsz是由msgp所指向的结构体的成员 mtext的最大大小决定的(byte)

msgtyp有三种形式:

        1.msgtyp=0:读取队列的第一个消息

        2.msgtyp>0:读取队列类型为msgtyp的第一条消息,除非在msgflg中指定了 MSG_EXCEPT,否则将读取类型不等于 megtyp的队列中的第一条消息,

        3.msgtyp<0:读取队列中最小类型小于或等于msgtyp绝对值的第一条消息

msgflg:创建标记,若指定了IPC_NOWAIT,获取失败后就直接返回 

     (4)操作消息队列的接口

int msgctl(int msqid , int cmd, struct msqid_ds *buf)

参数:

        msqid:消息队列的ID

        cmd:控制命令:

                IPC_RMID,删除命令

                IPC_STAT,获取命令

        buf:存储队列的相关信息的buf

返回值:

        成功:根据不同的cmd有不同的返回值

        失败: 返回-1,并设置errno

5.代码实现:

写端发送消息,读端从队列读取

mesgrcv:

#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
#include<sys/ipc.h>

struct msgbuf
{
   long mtype;
   char mtext[1024];

};


int main()
{
 int msg_id=msgget(0x06060606,IPC_CREAT|0664);
 if(msg_id<0 )
{
 perror("msgget \n" );
return 0;
}

printf("msggqueued id is %d\n",msg_id );
struct msgbuf mq;
msgrcv(msg_id,&mq,sizeof(mq.mtext),1,0);
printf("接受的消息:%s \n",mq.mtext);

return 0;
}

msgsnd:

#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>

struct msgbuf
{
     long mtype;        //message type
     char mtext[512];   //message data

};

int main()
{
 int msg_qid=msgget(0x06060606,IPC_CREAT|0664);
 if(msg_qid<0 )
  {
    perror("msgget\n");
  return 0;
  }

  struct msgbuf mq;

  int i;
  for(i=0;i<10;i++)
 {
   mq.mtype=i+1;
   sprintf(mq.mtext,"%s,%d ","xxxxxxxxxx ",i+1);
   msgsnd(msg_qid,&mq,sizeof(mq.mtext),0);
 }

return 0;
}

查看系统中的message queue:

Linux进程通信之消息队列 

 Linux进程通信之消息队列

当多次读出时,由于消息已经出了队列,所以不能再读出。文章来源地址https://www.toymoban.com/news/detail-455352.html

到了这里,关于Linux进程通信之消息队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux进程间通信 - 信号(signal) 与 管道(pipe) 与 消息队列

    什么是进程间通信,就是进程与进程之间进行通信,互相发送消息;可以通过 信号 或者 管道 或者 消息队列 或者 信号量 去通信! 目录 一、信号 1. 信号简介  2. 都有那些信号? 3. 注册信号的函数 1). signal 2). sigaction (项目中强烈推荐使用) 4. 信号发送 1). kill 函数 2). alarm 函

    2024年02月01日
    浏览(38)
  • 【Linux】进程间通信——system V共享内存 | 消息队列 | 信号量

    共享内存是一种在多个进程之间进行进程间通信的机制。它允许多个进程访问相同的物理内存区域,从而实现高效的数据交换和通信。 因为 进程具有独立性(隔离性) ,内核数据结构包括对应的代码、数据与页表都是独立的。OS系统为了让进程间进行通信,必须让不同的进

    2024年02月15日
    浏览(51)
  • Linux之进程间通信——system V(共享内存、消息队列、信号量等)

    本文介绍了另一种进程间通信——system V,主要介绍了共享内存,消息队列、信号量,当然消息队列了信号量并非重点,简单了解即可。 共享内存 :不同的进程为了进行通信看到的同一个内存块,该内存块被称为共享内存。 进程具有独立性,它的内核数据结构包括对应的代

    2024年02月08日
    浏览(59)
  • 进程间通信 + 消息队列

    每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1吧数据从用户空间考到内核缓冲区,进程2再从内核缓冲区吧数据读走,内核提供的这种机制成为进程间通信 管

    2024年02月09日
    浏览(33)
  • 【linux】进行间通信——共享内存+消息队列+信号量

    进程间通信方式目前我们已经学了匿名管道,命名管道。让两个独立的进程通信,前提是看到同一份资源。匿名管道适用于血缘关系的进程,一个打开写端一个打开读端实现的。命名管道适用于完全独立的进程,打开同一份文件实现的。 接下来我们看看剩下的实现进程间通信

    2024年02月05日
    浏览(45)
  • Laravel 队列监听Superviso进程管理(消息队列后台监听)

    在 Ubuntu 系统上,可以使用以下命令安装 Supervisor: 在CentOS: 安装完成后,Supervisor 的配置文件会被放置在  /etc/supervisor/conf.d/  目录下 在  /etc/supervisor/conf.d/  目录下创建一个新的配置文件,例如  laravel-worker.conf : 编辑配置文件: 在打开的文件中,添加以下配置: 运行以

    2024年02月02日
    浏览(33)
  • Qt共享内存实现进程间消息队列

    在Qt 5.9中,可以使用Qt的跨进程通信机制来实现进程间的消息队列。这个机制是通过Qt的QSharedMemory、QSystemSemaphore和QSharedMemory类来实现的。 首先,你需要创建一个消息队列的服务器端和客户端。服务器端负责接收和处理消息,客户端负责发送消息。 服务器端的代码示例如下:

    2024年02月09日
    浏览(40)
  • 消息队列(11) - 通信协议的设计

    对于我们客户端与服务器之间的通信协议我们约定如下: 具体的协议设计: 之后我们传递的参数也是这些 关于 type其实是在描述当前这个请求 、 响应是在调用那个API 约定如下 对于channel ,是tcp链接中的一个逻辑上的链接,一个TCP可以有多个Channel,存在的意义是为了让TCP得到复用

    2024年02月13日
    浏览(31)
  • 项目实战 — 消息队列(8){网络通信设计①}

    目录 一、自定义应用层协议 🍅 1、格式定义 🍅 2、准备工作 🎄定义请求和响应   🎄 定义BasicArguments 🎄 定义BasicReturns 🍅 2、创建参数类         🎄 交换机         🎄 队列         🎄 绑定         🎄发布消息         🎄 订阅消息         🎄确认应答

    2024年02月13日
    浏览(40)
  • 在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value

    Python 自带的多进程库 multiprocessing 可实现多进程。我想用这些短例子示范如何优雅地用多线程。中文网络上,有些人只是翻译了旧版的 Python 官网的多进程文档。而我这篇文章会额外讲一讲下方加粗部分的内容。 创建进程 Process, fork 直接继承资源,所以初始化更快,spawn 只

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包