码迷,mamicode.com
首页 > 系统相关 > 详细

linux消息队列概念

时间:2016-07-12 15:39:11      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:linux   消息队列   

消息队列的概念:

消息队列提供了一种从进程向另一个进程发送一个数据块的方法。每个数据块都被认为是用一个类型,接收者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞的问题。消息队列与管道不同的事,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。消息队列和命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也是有一个上限(MSGMNI)。

IPC对象数据结构:

struct ipc_perm

{

key_t __key;

uid_t uid;

gid_t gid;

uid_t cuid;

gid)t cgid;

unsigned short mode;

unsigned short short__seq;

};

创建新消息队列或取得已存在消息队列:

int msgget(key_t key,int msgflg)

key:可以认为是一个端口号,也可以由函数ftok生成;

msgflg:

IPC_CREAT:如果IPC不存在,则创建一个IPC资源,否则打开操作。

IPC_EXCL:只有在共享内存不存在的时候,新的内存共享才建立,否则就产生错误。

如果单独使用IPC_CRETA,XXXget()函数要么返回一个已经存在的共享内存的操作符,要么返回一个新建的共享内存的标识符。

如果将IPC_CRETA和IPC_EXCL标志一起使用,XXXget()将返回一个新建的IPC标识符;如果IPC资源存在,则返回-1。

IPC_EXEL标志本身并没有太大的意义,但是和IPC_CREAT标志一起使用可以用来保证所得对象是新建的,而不是打开已有的对象。

向队列读/写消息:

读消息:ssize_t magrcv(int msqid,void* msgp,size_t masgsz,long msgtyp,int msgflg);

写消息:int msgsnd(int msqid,const void* msgp,size_t msgsz,int msgflg);

参数:

msgqid:消息队列的标识码;

msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,

struct msgstru

{

long mytype;//大于0

char mtext[用户指定大小];

};

msgsz:消息的大小;

msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取;

msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而是立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG。当msgflg为0时,msgsnd()和msggrc()在队列呈空的情形时,采取阻塞等待的处理模式。

设置消息队列的属性:

int msgctl(int msgqid,int cmd,struct msqid_ds* buf)

参数:

msgctl系统调用对msgqid标识的队列消息执行cmd操作,系统定义了3种cmd操作:IPC_STAT,IPC_SET,IPC_RMID

IPC_STAT:该命令用来获取消息队列对应的msgqid_ds数据结构,并将其保存到buf指定的地址空间。

IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf中。

IPC_RMID:从内核中删除msgqid标识的消息队列。

ftok函数:把一个已存在的路径名和一个整数标识转换成一个key_t值,称为IPC键。

key_t ftok(const char* pathname,int proj_id)

ftok的典型实现调用stat函数,然后组合一下三个值:

1、pathname所在的文件系统的信息(stat结构的st_dev成员);

2、该文件在本文系统内的索引节点号(stat结构的st_ino成员)

3、proj_id的低序8位(不能为0)

不能保证两个不同的路径名与同一个proj_id的组合产生不同的键,因为上面所列三个条目(文件系统标识符、索引节点、proj_id)中的信息位数可能大于一个整数的信息位数。


本文出自 “落幕知客” 博客,请务必保留此出处http://zheng2048.blog.51cto.com/10612048/1825705

linux消息队列概念

标签:linux   消息队列   

原文地址:http://zheng2048.blog.51cto.com/10612048/1825705

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!