System V消息队列
消息的基本属性
System V的消息属性包含在一个msqid_ds的结构中
struct msqid_ds{
    struct ipc_cerm msg_perm;  //读取权限, 0644, 0777
    struct *msg_first; //消息队列的第一条消息地址
    struct *msg_last; //消息队列的最后一条消息地址
    msglen_t msg_cbytes; //当前消息的长度
    msgnum_t msg_qnum; //消息队列中的消息总数
    msglen_t msg_qbytes; //一条消息的最大长度
    pid_t msg_lspid; //last sender进程ID
    pid_t msg_lrpid; //last receiver进程ID
    time_t msg_stime; //time of last msgsnd()
    time_t msg_rtime; //time of last msgrcv()
    time_t msg_ctime; //time of last msgctl()
};
消息格式:
由一个结构组成,第一个long参数类型表示消息类型(怎么解读消息由用户自己定义与系统无关), 且其值必须大于0; 第二个为消息内容, 其长度和数据类型可自定义; 除第一个结构成员固定外, 其它成员的数量也可以自定义
struct msgbuf{
    long mtype;
    char mtext[1];
}
基本函数:
#include <sys/ipc.h>
key_t ftok(char *fname, int id);
#include <sys/msg.h>
int msgget(key_t key, int oflag);
int msgsnd(int msgqid, const void *ptr, size_t length, int flag);
ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag);
int msgctl(int msqid, int cmd, struct msqid_ds *buff);
ftok函数:用于生成一个唯一的key_t, fname为一个已存在的文件名, id取0-255之间的正整数. 实际是通过获取文件的i节点号再加上id形成唯一的key_t.
msgget函数:key_t可以为IPC_PRIVATE生成随机数; oflag可以是0644|IPC_CREAT|IPC_EXCL的组合
msgsnd函数:前三个参数同write函数, flag为0或IPC_NOWAIT设定是否等待
msgrcv函数:前三个参数同read函数,flag参数同msgsnd
type=0时按顺序取出第一条消息
type>0时取出消息队列中type为其值的第一条消息
type<0时取绝对值范围内type最小的第一条消息
msgctl函数:
cmd=IPC_RMID时,删除指定的msqid消息队列,第三个参数无意义
cmd=IPC_SET时,用第三个参数来代替当前消息队列属性
cmd=IPC_STAT,获取msqid消息队列的属性,通过第三个参数返回
包裹函数
vmqpack.h
#ifndef _VMQPACK_H
#define _VMQPACK_H
#include "unpipc.h"
#include <sys/types.h>
#include <sys/msg.h>
struct msgbuf{
    long mtype;
    char mtext[100];
};
key_t Ftok(char *fname,int id);
int Msgget(key_t key,int oflag);
void Msgsnd(int mqid,const void *ptr,size_t length, int flag);
ssize_t Msgrcv(int msqid, void *ptr, size_t length, long type, int flag);
void Msgctl(int msqid, int cmd, struct msqid_ds *buff);
#endif
vmqpack.c
#include "vmqpack.h"
key_t Ftok(char *fname,int id){
    key_t key=ftok(fname,id);
    if(key == -1)
        err_quit("ftok error");
    return key;
}
int Msgget(key_t key,int oflag){
    int mqid=msgget(key,oflag);
    if(mqid == -1)
        err_quit("msgget errror");
    return mqid;
}
void Msgsnd(int mqid, const void *ptr, size_t length, int flag){
    if(msgsnd(mqid,ptr,length,flag) == -1)
        err_quit("msgsnd error");
}
ssize_t Msgrcv(int msqid, void *ptr, size_t length, long type, int flag ){
    ssize_t n=msgrcv(msqid,ptr,length,type,flag);
    if(n == -1)
        err_quit("msgrcv error");
    return n;
}
void Msgctl(int msqid, int cmd, struct msqid_ds *buff){
    int ret=msgctl(msqid,cmd,buff);
    if(ret == -1)
        err_quit("msgctl error");
}
发送与接收
send.c
#include "vmqpack.h"
int main(int argc, char *argv[]){
    int mqid;
    long type;
    struct msgbuf buf;
    if(argc != 3)
        err_quit("usage: send <pathname> <type>");
    type=atoi(argv[2]);
    mqid=Msgget(ftok(argv[1],0),0644|IPC_CREAT);
    buf.mtype=type;
    strncpy(buf.mtext,"hello, server",strlen("hello,server")+1);
    Msgsnd(mqid,&buf,sizeof(buf),0);
    exit(0);
}
recv.c
#include "vmqpack.h"
int main(int argc, char *argv[]){
    int c,flag,mqid;
    long type;
    ssize_t n;
    struct msgbuf buff;
    key_t key;
    type=flag=0;
    while((c=getopt(argc,argv,"nt:")) != -1){
        switch(c){
            case 'n':
                flag |= IPC_NOWAIT;
                break;
            case 't':
                type=atol(optarg);
                break;
        }
    }
    if(optind != argc -1)
        err_quit("usage: recv[-n] [-t type] <pathname>");
    key=Ftok(argv[optind],0);
    mqid=Msgget(key,0400);
    n=Msgrcv(mqid,&buff,sizeof(buff),type,flag);
    printf("read %d bytes, type=%ld\n",n,buff.mtype);
    printf("msgdata: %s\n",buff.mtext);
    Msgctl(mqid,IPC_RMID,NULL);
    exit(0);
}
System V消息队列的更多相关文章
- 进程间通信 System V 消息队列
		1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ... 
- 第6章 System V消息队列
		6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ... 
- Linux进程通信之System V消息队列
		System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ... 
- 利用System V消息队列实现回射客户/服务器
		一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ... 
- UNIX环境高级编程——system V消息队列
		unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的. 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表. 可以把消 ... 
- linux c编程:System V消息队列一
		消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ... 
- 第二十五章 system v消息队列(一)
		IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ... 
- linux网络编程之system v消息队列(二)
		今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ... 
- Linux IPC System V  消息队列
		模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> ftok() //获取key ... 
随机推荐
- Gradle实战:发布aar包到maven仓库
			查看原文:http://blog.csdn.net/u010818425/article/details/52441711 Gradle实战系列文章: <Gradle基本知识点与常用配置> ... 
- java中的容器问题
			小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ... 
- (六)u-boot2013.01.01 for TQ210:《精简u-boot文件目录,定制自己的目标板》
			1. 删改U-boot代码结构 把不用到的和与我们s5pv210移植无关的硬件平台代码统统删除,眼不见为净.这样代码看起来就干净利落多了. 1.1.进入arch目录,删掉除arm以外的目录 处理前: ... 
- jquery plugins —— datatables 搜索后汇总
			网上的例子 http://datatables.club/example/plug-ins/api.html只能对当前页面或所有数据进行汇总,不能对搜索结果数据汇总. 以下是对datatables自带 ... 
- C# 学习笔记03 DataTable
			1. DataTable 类对象表示一个内存中数据表.可以用来存放从数据库得到的DataSet. DataTable dt = SqlHelper.ExecuteDataTable(parameter ... 
- 如何取消IE“已限制此网页运行可以访问计算机的脚本或ActiveX控件
			在本地调试html页,如果其中包含js或flash,IE经常会提示“IE已限制此网页运行可以访问计算机的脚本或ActiveX控件”.虽然IE出于安全考虑阻止本地脚本运行这个做法没错,但作为程序开发者来 ... 
- Javascript中二级联动
			主要使用到到了地址JSON格式,来做,没有涉及数据库的读取. <!DOCTYPE html><html><head> <meta charset=" ... 
- 【转载】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
			http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及 ... 
- Quartz.net官方开发指南系列篇
			Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ... 
- Every student in every school should have the opportunity to learn to code
			“I think everybody in this country should learn how to program a computerbecause it teaches you how ... 
