题目: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. 【2015 ICPC亚洲区域赛长春站 G】Dancing Stars on Me(几何+暴力)

    Problem Description The sky was brushed clean by the wind and the stars were cold in a black sky. Wh ...

  2. 自动曝光修复算法 附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...

  3. eclipse中误删tomcat后,文件都报错,恢复server时无法选择tomcat7.0解决办法

    创建Tomcat v7.0 Server 不能进行下一步. 解决方法: 1.退出 eclipse 2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runt ...

  4. 外键参数 onupdate,ondelete等(cascade,no adcion,set null,restrict)

    MySQL外键约束On Delete.On Update各取值的含义 先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性. 当 ...

  5. 自定义注解实现(spring aop)

    1.基本概念 1.1 aop 即面向切面编程,优点是耦合性低,能使业务处理和切面处理分开开发,扩展和修改方面,当引入了注解方式时,使用起来更加方便. 1.2 应用场景 打日志.分析代码执行时间.权限控 ...

  6. C# WebBrowser获取指定字符串的坐标

    public void FindKeyWord(string keyWord) { WebBrowser wb = new WebBrowser(); foreach (HtmlElement ite ...

  7. PTA基础编程题目集7-2然后是几点

    有时候人们用四位数字表示一个时间,比如1106表示11点零6分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计 ...

  8. 阿里云 Debian 9.2 安装 Java Web 环境

    CentOS 源内包太旧,和本地开发环境不兼容的地方太多 系统配置 更新数据库与软件包 # apt-get update && apt-get -y upgrade 提示是否保留本地已 ...

  9. BZOJ1228: [SDOI2009]E&D(打表SG)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 583[Submit][Status][Discuss] Descriptio ...

  10. restTemplate访问接口

    后端技术精选 每天推送精选技术好文,涉及Java.python.Linux及MySQL,欢迎关注微信公众号:后端技术精选 随笔 - 52, 文章 - 0, 评论 - 50, 引用 - 0 Spring ...