码迷,mamicode.com
首页 > 其他好文 > 详细

System V 消息队列

时间:2014-12-23 11:59:35      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

3.1 概述

消息队列结构:

struct msqid_ds
{
        struct ipc_perm         msg_perm;        //权限结构
        struct msg              *msg_first;      //队列中第一个消息
        struct msg              *msg_last;       //队列中最后一个消息
        msglen_t                msg_cbytes;      //队列中当前消息总字节数
        msglen_t                msg_qbytes;      //队列中最大消息总字节数
        msgqnum_t               msg_qnum;        //队列中当前消息数
        pid_t                   msg_lspid;       //最后发送消息进程
        pid_t                   msg_lrpid;       //最后接收消息进程
        time_t                  msg_stime;       //最后发送时间
        time_t                  msg_rtime;       //最后接收时间
        time_t                  msg_ctime;       //最后修改时间
};

内核中消息队列结构:
技术分享

6.2 msgget函数

#include <sys/msg.h>
int msgget(key_t key,int oflag)

oflag:0x0400|0x0200 | 0x0040|0x0020 | 0x0004|0x0002 | IPC_CREAT | IPC_EXCL

创建一个消息队列时:

msg_perm中的uid、gid、cuid、cgid依据调用进程来初始化

msg_perm中的mode依据oflag进行初始化

msg_qnum、msg_lspid、msg_lrpid、msg_stime、msg_rtime置为0

msg_ctime置为当前时间

msg_qbytes设置为系统限制值

6.3 msgsnd函数

#include <sys/msg.h>
int msgsnd(int msqid,void *ptr,size_t len,int flag)

ptr一般是自定义的消息结构

struct mymsg
{
        long type;
        char text[LEN];
};

len:mymsg结构中类型字段之后的数据长度

falg:IPC_NOWAIT 非阻塞msgsnd(msgsnd不能向队列中写消息时,阻塞还是出错返回的控制位),也可以置为0

6.4 msgrcv函数

#include <sys/msg.h>
ssize_t msgrcv(int msqid,void *ptr,size_t len,long type,int flag)

ptr:接收数据缓冲区

len:缓冲区长度

type:接收的消息类型

         0:接收队列中第一个消息

         大于0:接收type类型的消息

         小于0:接收类型值小于等于|type|的消息中类型值最小的第一个消息

flag:在消息队列中没有指定消息类型时,出错返回还是阻塞

6.5 msgctl函数

#include <sys/msg.h>
int msgctl(int msgid,int cmd,struct msqid_ds *buf)

IPC_STAT:将某个消息队列的信息写到buf中

IPC_SET:按照buf中的mag_perm.uid,msg_perm.gid、msg_perm.mode和msg_qbytes修改消息队列对应项

IPC_RMID:buf忽略,删除消息队列

 

System V 消息队列

标签:

原文地址:http://www.cnblogs.com/buptlyn/p/4179783.html

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