题目: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); // 创建key
if (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;
}

  

自测之Lesson11:消息和消息队列的更多相关文章

  1. rabbitmq之消息重入队列

    说起消息重入队列还得从队列注册消费者说起,客户端在向队列注册消费者之后,创建的channel也会被主队列进程monitor,当channel挂掉后,主队列进程(rabbit_amqqueue_proc ...

  2. 【转】windows消息和消息队列详解

    转载出处:http://blog.csdn.net/bichenggui/article/details/4677494  windows消息和消息队列 与基于MS - DOS的应用程序不同,Wind ...

  3. windows消息和消息队列

    windows消息和消息队列 转自:http://blog.163.com/zhangjie_0303/blog/static/990827062010113062446767/ 与基于MS - DO ...

  4. MSMQ 队列消息和死信队列

    日志消息 日志队列可以保存你操作过的消息的备份.它的好处是,一但发现前面的操作失败,可以从日志队列中重新创建出原先的消息对象,然后再进行操作. 例如,向远方发送一个消息对象,然后对方返回一个失败的确认 ...

  5. RabbitMQ Queue中Arguments属性参数过期队列,过期消息,超时队列的声明

    开发十年,就只剩下这套Java开发体系了 >>>   创建队列时指定参数 队列属性:x-message-ttl 可以控制被publish到queue中的message 被丢弃前能够存 ...

  6. Windows运行机理——消息与消息队列

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 Windows程序设计时一种基于消息的时机驱动方式的设计模式,完全不同 ...

  7. 【mq读书笔记】消息确认(失败消息,定时队列重新消费)

    接上文的集群模式,监听器返回RECONSUME_LATER,需要将将这些消息发送给Broker延迟消息.如果发送ack消息失败,将延迟5s后提交线程池进行消费. 入口:ConsumeMessageCo ...

  8. RabbitMQ延迟消息:死信队列 | 延迟插件 | 二合一用法+踩坑手记+最佳使用心得

    前言 前段时间写过一篇: # RabbitMQ:消息丢失 | 消息重复 | 消息积压的原因+解决方案+网上学不到的使用心得 很多人加了我好友,说很喜欢这篇文章,也问了我一些问题. 因为最近工作比较忙, ...

  9. 对WM_NCHITTEST消息的了解+代码实例进行演示(消息产生消息,共24个枚举值)

    这个消息比较实用也很关键,它代表非显示区域命中测试.这个消息优先于所有其他的显示区域和非显示区域鼠标消息.其中lParam参数含有鼠标位置的x和y屏幕坐标,wParam 这里没有用. Windows应 ...

  10. RTMP规范 消息与消息块

    Real Time Messaging Protocol(实时消息传输协议) 应用层协议 RTMP协议中, 基本数据单元称为消息(Message).当RTMP协议在互联网中传输数据的时候,消息会被拆分 ...

随机推荐

  1. POJ 2208--Pyramids(欧拉四面体体积计算)

    Pyramids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3451   Accepted: 1123   Specia ...

  2. Wireshark抓取Mqtt报文

    安装版本较高的Wireshark,我的版本是2.4.6,然后在编辑--> 首选项--> 协议中找到MQTT,然后将端口改为你MQTT服务器的端口,然后就可以在抓包中抓到MQTT了

  3. 登录验证码的生成Java代码

    package example7; import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java. ...

  4. 关于如何去Apple.cn下载Xcode以及模拟器包

    前言:对于一个懒惰的iOS开发,Xcode的更新我是迟迟没有去下载.有人或许会说:你并不是一个合格的iOS开发者! T3T 我承认自己缺少拓新精神,Apple的尿性是:坑死第一批体验者不偿命~表示本人 ...

  5. mongodb查看数据库和表的信息

    mongodb查看数据库和表的方法比较简单,在为这里推荐使用stats的方法,直观并且详细. 1.查看数据库 db.stats();1输出: { "db" : "siri ...

  6. 使用Screen管理远程会话

    ​ 在本地开发时,经常需要使用远程连接到Linux服务器,一开始我自己都是有几个远程就开几个SSH窗口,这种方法很原始很直接,但每次都受够了密码输入,即使用了SSH免密码登录,也会觉得每次输入SSH的 ...

  7. PHP对接QQ互联,超级详细!!!

    SDK下载

  8. 使用随机数以及扩容表进行join代码

    /** * 使用随机数和扩容表进行join */ JavaPairRDD<String, Row> expandedRDD = userid2InfoRDD.flatMapToPair( ...

  9. python学习——面向对象的三大特性

    一.继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 1.python中类的继承分为:单继承和多继承 class P ...

  10. golang 多维哈希(map,hashmap)实践随笔

    有些场景使用多维哈希来存储数据,时间复杂度恒定,简单粗暴好用.这里记录一下. 如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识. 下图是三维哈希在内存的存储形式,has ...