今晚来整理一下消息队列,消息队列是一条由消息连接而成的链表,存在内核里面,通过消息对了的引用标识符来访问,每个消息队列都有一个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. 【转】UIBezierPath精讲

    http://www.henishuo.com/uibezierpath-draw/ 基础知识 使用UIBezierPath可以创建基于矢量的路径,此类是Core Graphics框架关于路径的封装. ...

  2. STC89c52RC 的EEPROM和AVR的EEPROM

    二者的EEPROM不是一回事,AVR片内的EEPROM是独立于程序存储器的数据存储器,本身不能存储程序并运行,但现代MCU很多支持IAP,利用IAP技术可在程序存储空间实现数据存储即替代EEPROM, ...

  3. JavaIO(01)File类详解

    File类 file类中的主要方法和变量   常量: 表示路径的分割符:(windows) 作用:根据java可移植性的特点,编写路径一定要符合本地操作系统要求的分割符: public static ...

  4. Java学习笔记(八):集合类

    Java中对数据的存储会使用到集合类,下面我们来看看Java中常用的集合类. Collection接口 集合的接口,可以简单的理解为可以动态扩充的数组. Collection接口定义了很多相关的方法, ...

  5. 使用IIS Express

    1.IIS Express 概述 IIS Express是一个微软推出的一款免费,且小型.轻量特别适合ASP.NET开发人员使用的Web开发服务器.在没有IIS Express之前,开发人员只能使用下 ...

  6. AOE关键路径

    这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间. 从而算出活动最早开始的时间和最晚开始的时间,如果这两个时间相等,则为关键路径. 时间复杂度为O ...

  7. Hibernate的配置

    配置Hibernate 1.在项目中引入Hibernate的Jar包 在 WebContent/WEB-INF/lib 目录下 导入jar包 2.在Java Resources 下创建 hiberna ...

  8. java连接数据库的解决方法大全(mysql)

    解决方法一:(最重要的一种方法) 你看下my.ini,有无  [mysql] default-character-set=utf8 [client]  default-character-set=ut ...

  9. Linux设备模型分析之kset(基于3.10.1内核)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1   一.kset结构定义 kset结构体定义在include/linux/kobject.h ...

  10. oc-12-NSString 类简单介绍及用法

    // 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...