System V 消息队列

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忽略,删除消息队列

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