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

    一.Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志级别,日志要输出的地方和日志格式 1. Logger Logger的日志级别有6级,分别是TRA ...

  2. jquery easyui的方法参数

    1.form 表单的参数有:submit,validate,clear,load 2.submit 例如: $('#goods-add').form('submit', { url : url, on ...

  3. php-fpm 启动不了 libiconv.so.2找不到

    service php-fpm start  Starting php-fpm /alidata/server/php/sbin/php-fpm: error while loading shared ...

  4. Serializable 序列化为字符串 base64

    工具类 Base64.java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import ja ...

  5. 山东理工大学ACM平台题答案关于C语言 1580 闰年

    闰年 Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描述 时间过得真快啊,又要过年了,同时,我们的人生也增长了一年的阅历,又成熟了一些 ...

  6. IEBrowse学习笔记

    //登录 private void toolStripButton1_Click(object sender, EventArgs e) { //ie.ExecuteScript("aler ...

  7. MongoDB 快速入门--中级

    索引 ensureIndex 用来创建索引,需要注意的就是一个集合最多也就64个索引 如果没加所有就是表扫表,速度很慢, 当然如果索引的键有多个,就必须考虑顺序 拓展索引 同样的也可以为内嵌文档 建立 ...

  8. bash学习之变量的显示和设置

    显示变量:echo $MAIL或者 echo ${MAIL} [CJP@CJP ~]$ echo $MAIL /var/spool/mail/CJP [CJP@CJP ~]$ echo ${MAIL} ...

  9. 【不积跬步,无以致千里】VIM查找替换归纳总结zz

    http://spaces.msn.com/dingy/blog/cns!2F24B9E66A542581!327.entry VIM中常用的替换模式总结. 1,简单替换表达式 替换命令可以在全文中用 ...

  10. ssh 设置免password登录

    如果: 实现->操作机A机 要以用户"user1"身份.免password登录B机和C机? B机和C机 建立用户 user1 而且能够ssh 登录. A机设置: 1.安装ss ...