题目:key及ftok函数的作用。

解答:

key是用来创建消息队列的一个参数,当两个key相同时,创建消息队列会引起“误会”(除非有意为之)。所以我们可以通过ftok函数来获得一个“不易重复”的key。

key对于进程间通信也有帮助,当一进程知晓另一进程创建消息队列所用的key后,便可以使用该key访问该消息队列。

题目:编写一个可以向消息队列发送消息和接收消息的程序。

实现代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>struct msgbuf {                         // msgbuf结构体long mtype;char mtext[1024];
};void TestMsgSend(int msqid)
{while(1) {long msgType;struct msgbuf msg;fprintf(stderr, "Send[FORMAT:type msg]:");scanf("%ld%s", &msgType, msg.mtext);msg.mtype = msgType;int iRet = msgsnd(msqid, &msg, strlen(msg.mtext), 0); if (iRet == -1) {perror("fail msgsnd");return;}    }
}void TestMsgRecv(int msqid)
{struct msgbuf msg;long msgType;while (1) {fprintf(stderr, "Recv[FORMAT:type]:");scanf("%ld", &msgType);memset(msg.mtext, 0, 1024);msg.mtype = msgType;int iRet = msgrcv(msqid, &msg, 1024, msg.mtype, 0);if (iRet < 0) {perror ("fail magrcv");return;}printf("Recv:%s\n", msg.mtext);}}int main(int argc, char **argv)
{if (argc != 2 ||(strcmp(argv[1], "r") && strcmp(argv[1], "s"))){printf("Usage: %s [ r | s ]\n", argv[0]);printf("\t r:receive message queue\n");printf("\t s:send message queue\n");return 0;}key_t key;key = ftok("test1", 1);                 // 创建keyif (key == -1) {perror("fail ftok");return -1;}int msqid;msqid = msgget(key, IPC_CREAT | 0664);  // 创建消息队列if (msqid == -1) {perror("fail msgget");return -1;}if (argv[1][0] == 's') {                // 进程1向消息队列发送消息TestMsgSend(msqid);}else if (argv[1][0] == 'r') {           // 进程2从消息队列读取消息TestMsgRecv(msqid);}return 0;
}

  

转载于:https://www.cnblogs.com/xzxl/p/8542194.html

自测之Lesson11:消息和消息队列相关推荐

  1. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  2. arouter跨module传递消息_消息队列中间件(二)使用 ActiveMQ

    ActiveMQ 介绍 Active MQ 是由 Apache 出品的一款流行的功能强大的开源消息中间件,它速度快,支持跨语言的客户端,具有易于使用的企业集成模式和许多的高级功能,同时完全支持 JSM ...

  3. vs如何实现tcp连续发送多条消息_消息队列之 RabbitMQ

    为什么要使用MQ消息中间件?它解决了什么问题?关于为什么要使用消息中间件?消息中间件是如何做到同步变异步.流量削锋.应用解耦的?网上已经有很多说明,我这里就不再说明.我在接下来的RabbitMq系列博 ...

  4. java 如何判定消息已在队列_Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得.题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一个 ...

  5. videojs如何获取请求消息_消息队列中,如何保证消息的顺序性?

    点击?蓝色" 深入原理",关注并"设为星标" 技术干货,第一时间推送 消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的 ...

  6. 操作系统-消息,消息队列

    消息,消息队列 1. 消息 在windows 程序中,消息是由MSG 结构体来表示的.MSG 结构体的定义如下: typedef struct tagMSG {HWND hwnd;UINT messa ...

  7. ActiveMQ消息持久化_队列_7

    消息持久话 一 . 持久化 1.1  非持久 messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT) 非持久化:当服务器宕机,消息不存 ...

  8. RabbitMQ fanout广播消息使用匿名队列

    场景 我们希望发送的消息被所有绑定到这个交换机的所有队列消费到,那么我们通常会用到fanout类型的交换机, 但我们又不想固定队列名称,那么就需要随机的队列名称,RabbitMQ中的Anonymous ...

  9. 消息队列中:消息可靠性、重复消息、消息积压、利用消息实现分布式事务

    点击下方"Java编程鸭"关注并标星 更多精彩 第一时间直达 一.如何确保消息不丢失? 1.检测消息丢失的方法 可以利用消息队列的有序性来验证是否有消息丢失.在Producer端给 ...

  10. windows消息和消息队列详解

     windows消息和消息队列 与基于MS - DOS的应用程序不同,Windows的应用程序是事件(消息)驱动的.它们不会显式地调用函数(如C运行时库调用)来获取输入,而是等待windows向它们传 ...

最新文章

  1. python书籍_Python 之父宣布加盟微软!包邮送几本 Python 书籍压压惊!
  2. iOS应用:成功就像中彩票,大半开发者亏本
  3. 虚拟化服务器端口用万兆,万兆以太网部署需要注意的方面有哪些
  4. 【SICP练习】79 练习2.51
  5. 《金色梦乡》金句摘抄(二)
  6. [react] 在React中怎么阻止事件的默认行为?
  7. IntelliJ IDEA如何build path
  8. 自从有了这样的可视化报表,我们社区再没有过疫情(内含福利)
  9. Android基础知识点的整理3
  10. 强制停用华为桌面,换第三方桌面
  11. ajax性能测试脚本,mqtt性能测试工具
  12. Python一行代码实现ADF检验(时间序列平稳性检验)(包含结果解读)
  13. android耳机检测驱动,[RK3288][Android6.0] 有线耳机驱动小结
  14. STAR法则修改简历
  15. 服务器端返回的状态码是什么意思
  16. 企业金融App评测系列——微众银行以App构筑企业金融服务新生态,成为企业的随身数字银行
  17. Iterator 的用法
  18. PMP考试一定要报培训班吗?
  19. Windows Presentation Foundation 巡游
  20. STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换

热门文章

  1. PHP 高级编程之多线程
  2. Dijkstra算法.
  3. Skype for Business Server 2015-升级-实战公开课(免费视频)
  4. OpenGL ES 详解纹理生成和纹理映射步骤以及函数
  5. iptables 实现地址转换与安全控制
  6. 2019年第一个工作日!
  7. Python爬虫之诗歌接龙
  8. JavaScript调用Applet的函数
  9. 2dx解析cocosbuilder中使用layer时的缺陷
  10. 如何找回误删并清除了回收站的文档