今晚来整理一下消息队列,消息队列是一条由消息连接而成的链表,存在内核里面,通过消息对了的引用标识符来访问,每个消息队列都有一个msqid_ds结构与之对应,这个结构保存了消息队列的当前状态参数,这个结构的定义如下:

 1 steuct msqid_ds
2 {
3 struct ipc_perm msg_perm;
4 struct msg *msg_first;
5 struct msg *msg_last;
6 ulong msg_ctypes;
7 ulong msg_qnum;
8 ulong msg_qbytes;
9 pid_t msg_lspid;
10 pid_t msg_lrpid;
11 time_t msg_stime;
12 time_t msg_rtime;
13 time_t msg_ctime;
14 }

这个结构每个域都有相关的定义,下面来述说一下消息队列 的具体内容:

1,创建或打开消息队列的操作

通过系统函数的调用,可以创建或者打开消息队列,把一个消息发送到消息队列中以及从消息队列中获取消息,首先来看打开消息队列 的函数

#include <sys/types.h0>
#include <sys/ipc.h>
#include <sys/msq.h>
int message(key_t key,int flag);

  这个函数可以创建一个新的消息队列也可以打开一个已经存在的消息队列,这取决于key和flag的值,函数执行成功时会返回消息队列的引用标识符,否则返回-1,而当一个新的消息队列创建时,与之对应的msqid_ds结构也会被初始化,这里不具体说明了,下面举个例子来说明。

例:下列程序根据相关用户输入关键字,以权限-rw-rw---创建或打开一个消息队列,代码如下:

msgget.c

2,发送和接受消息

消息队列有发送消息和接受消息两种操作,进程通过这两种操作实现进程间的通信。

发送消息分的函数说明如下:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <int msqid,const void *ptr,size_t nbytes,int flag>;
//msqid消息队列的引用标识符。新发送的消息插入到消息队列的末尾
//ptr指向一个长正整数的指针,这个正整数之后紧跟消息队列中所传递的数据
//nbytes消息的长度,不包含在长正整数在内,以字节记
//flag可以取0或者IPC_NOWAIT

函数返回成功为0,否则为-1。

接受消息的函数说明如下:

#include <sys/yypes.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include (int msqid,void *ptr,size_t nbytes,long type,int flag);
//msqid消息队列的引用标识符。
//ptr指向一个长正整数的指针,这个正整数之后紧跟消息队列中所传递的数据
//nbytes要接收消息数据的长度,以字节记
//type这个参数用来指定要接受队列中的那条信息
//flagflag中的两位与接收消息有关

  现在可以编写用消息队列进行通信的程序了,编写两个程序,一个接收一个发送,代码如下:

接收msgrcv
发送msgsnd

两个程序运行的结果如下:

$./发送magsnd
Enter some text:hello
Enter some text:world
Enter some text:end
$./接收msgrcv
You wrote:hello
You wrote:world
You wrote:end

从这个例子当中,可以看出,通信的进程可以是完全无关的两个进程,不需要约定同步分方法。

3,控制消息进程

msgctl函数用于对消息队列进行控制,它的原型如下:

#include <sys/msg.h>
#include (int msqid,int cmd,struct msqid_ds *buf);

msgctl函数对msqidl函数指定的消息队列执行参数cmd要求的控制操作,参数msqid是一个正整数,它必须由msgget返回的消息队列的id

下面来句一个例子总结说明消息队列,代码如下:

Msg.c 

The message queue的更多相关文章

  1. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...

  2. MSMQ(Microsoft Message Queue)

    http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...

  3. Message Queue vs. Web Services?

    From stackoverflow.com When you use a web service you have a client and a server: If the server fail ...

  4. hdu 1509 Windows Message Queue

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...

  5. 为什么要用Message Queue

    摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral 为什么要用Message Queue 解 ...

  6. 单线程模型中Message、Handler、Message Queue、Looper之间的关系

    1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...

  7. Top 10 Uses of a Message Queue

    Top 10 Uses of a Message QueueAsynchronicity, Work Dispatch, Load Buffering, Database Offloading, an ...

  8. hdoj 1509 Windows Message Queue【优先队列】

    Windows Message Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  9. 详解boost库中的Message Queue .

    Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...

  10. Windows Message Queue(优先队列)

    欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Windows Message Queue Time Limit: 2000/1000 MS (Java/Others)    Mem ...

随机推荐

  1. Shell统计报表表格生成

    基本需求 分析完数据后,一般需要将数据以附件的形式发送处理,这个已经在<>中有介绍,如何 用Python实现附件的发送. 但不是所有人都关心附件的内容,一般邮件中需要有些概要的信息,如附件 ...

  2. Android实例-全屏显示程序(XE10+小米2)(无图)

    方法一:选中窗体->BorderStyle改为“None” 方法二: 1.下载第三方控件QAndroid.Shell 2.执行FShell.Execute('su -c mount -o rem ...

  3. ds18b20里的 温度值正负判断 为什么要判断大于6348 ,为什么取这个值?

    http://zhidao.baidu.com/question/576118682.html?quesup2&oldq=1

  4. CCS3.3入门

    CCS3安装包下载地址:http://pan.baidu.com/share/link?shareid=1887452332&uk=1799203308&qq-pf-to=pcqq.c ...

  5. 织梦dedecms后台添加图片style全部都变成st<x>yle的解决办法

    可乐站长在建站的时候,上传缩略图喜欢输入图片路径,不喜欢上传图片,有几次我上传图片路径为:/style/image/**.jpg,然后返回修改后,图片为路径却为:/st<x>yle/ima ...

  6. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

  7. 移植FreeModbus+ModbusMaster+STM32至RT-Thread(初步)

    一.项目描述 目前操作系统在嵌入式软件行业非常流行,在工控组网方面,以后可能会经常使用到Modbus主机+操作系统.Modbus从机+操作系统甚至Modbus主机+Modbus从机+操作系统.但是操作 ...

  8. Codeforces Gym 100342C Problem C. Painting Cottages 暴力

    Problem C. Painting CottagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1 ...

  9. iOS开发——实用篇Swift篇&QQ登入界面实现

    QQ登入界面实现 我们知道在App Store中几乎所有软件都设计到账户的登入,而我们最常见的就是QQ,微信,在没有踏入程序员这条不归路之前,看到一个个的界面都感觉好高大上的样子. 在学习的过程中,自 ...

  10. JS加解密URL参数encodeURIComponent() decodeURIComponent()

    参考1:http://www.w3school.com.cn/js/jsref_encodeURIComponent.asp 参考2:http://www.w3school.com.cn/js/jsr ...