今晚来整理一下消息队列,消息队列是一条由消息连接而成的链表,存在内核里面,通过消息对了的引用标识符来访问,每个消息队列都有一个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. sass学习(1)——了解sass

    为什么要选择sass 我们在手写css中,会遇到很多很麻烦的问题.倒不是一些技术的问题,而是工程量的问题.例如,如何可以代替难记的16进制颜色,如何可以让层次更清晰,还有重复的代码该如何偷懒.其实这一 ...

  2. awk的二维数组

    awk是不支持二维数组的,它的底层是一维数组,将两个key拼接为一维数组的key. 如下是其初始化和遍历 awk 'BEGIN{ for(i=0;i< 3; ++i) for(j = 0; j ...

  3. iOS事件机制(二)

    从上一篇的内容我们知道,在iOS中一个事件用一个UIEvent对象表示,UITouch用来表示一次对屏幕的操作动作,由多个UITouch对象构成了一个UIEvent对象.另外,UIResponder是 ...

  4. DelphiXE8新建AVD

    相关资料: 1.http://jingyan.baidu.com/article/ea24bc398576b3da62b33107.html

  5. Oracle创建dblink报错:ORA-01017、ORA-02063解决

    Oracle环境:oracle 10.2.0.1 创建的 public dblink 连接oracle 11.2.0.3 ORA-01017: invalid username/password; l ...

  6. POJ1328Radar Installation(贪心)

    对于每一个点,可以找到他在x轴上的可行区域,这样的话就变为了对区间的贪心. #include<iostream> #include<stdio.h> #include<s ...

  7. 使用 DllImport 属性

    本主题说明 DllImport 属性的常见用法.第一节讨论使用 DllImport 从托管应用程序调用本机代码的优点.第二节集中讨论封送处理和 DllImport 属性的各个方面. 从托管应用程序调用 ...

  8. Lua学习笔记(四):表和数组

    表 在Lua中,表(table)是十分重要的一种数据结构,实际上Lua对于复杂数据类型也仅提供了表给我们,我们通过表可以实现我们需要的大部分重要的数据结构,比如数组. table类型实现了关联数组,关 ...

  9. 访问修饰符与可选修饰符static的使用

    在Java中修饰符较多,在这里简单说一说几个访问修饰符的选择使用,和可选修饰符static的使用. 一.访问修饰符:这是Java里用来控制访问类及类的方法.变量的访问权限,从而达到只暴露接口,来隐藏内 ...

  10. 教你50招提升ASP.NET性能(十九):静态集合

    (30)Static collections 招数30: 静态集合 If a collection is static, make sure it only contains the objects ...