Linux进程间通信(八)---消息队列之msgget()、msgsnd()、msgrcv()及其基础实验

/*********************************************************************

* 2019年6月26日声明:本博客资源下载积分最开始为免费的,我也不知道为什么有的很高了。

*如果有问题加我微信:wensong2048,(加我备注来源以及需求,否则不通过,谢谢)

*********************************************************************/

概述

   消息队列,就是一些消息的列表,用户可以在消息队列中添加消息和读取消息等。从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势。同时,这些消息又是存在于内核中的,由“队列ID”来标识。

消息队列的实现操作

  ①  创建或打开消息队列。使用的函数是msgget(),这里创建的消息队列的数量会受到系统消息队列数量的限制。

  ②  添加消息。使用的函数是msgsnd(),它把消息添加到已打开的消息队列末尾。

  ③  读取消息。使用的函数是msgrcv(),它把消息从消息队列中取走,与FIFO不同的是,这里可以取走指定的某一条消息。

  ④  控制消息队列。使用的函数是msgctl(),它可以完成多项功能。

函数格式

基础实验

功能

   本实验意在展示如何使用消息队列进行两个进程(发送端和接收端)之间的通信,包括消息队列的创建、消息发送与读取、消息队列的撤销和删除等多种操作。

   消息发送端进程和消息接收端进程不需要额外实现进程间的同步。在本实验中,发送端发送的消息类型设置为该进程的进程号(可以取其他值),因此接收端根据消息类型来确定消息发送者的进程号。注意这里使用了ftok()函数,它可以根据不同的路径和关键字来产生标准的key。

源程序

  本实验包括两个文件,msgsnd.c文件和msgrcv.c文件。下面贴出这两部分的代码。

msgrcv.c文件,点此下载

msgsnd.c文件,点此下载

执行程序

  需要开两个终端,将上述文件下载后编译,首先在终端1上执行msgrcv创建一个消息队列,然后在终端2上执行msgsnd,向消息队列中发送消息。

终端1

终端2

在终端2输入消息后

此时终端1

到这里,实验已经完了。

但是我在做实验的时候,有一次,先打开了msgsnd,输入了消息,并且输入了“quit”退出了msgsnd程序,然后打开了msgrcv,发现msgrcv也接收到了刚才的消息,有点意思,建议做一下,然后思考一下为什么会这样。

同时,使用命令 ipcs -q可以查看当前系统的消息队列的信息。

 

 

  

 

  • 12
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖零大壮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值