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

时间: 2024-08-24 11:08:57

System V 消息队列的相关文章

进程间通信 System V 消息队列

1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_t length ,int flag ) // 发送 3.msgrcv() //读 4.msgctl(int msid , int cmd ,struct  msqid_ds *buff )//  cmd 提供删除,设置,返回当前 tips : 1.客户端服务端例子 服务端创建两个消息队列,A,B,

细说linux IPC(十):system V 消息队列

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类似,linux系统这两种消息队列都支持.先来看一下system V消息队列相关操作及其函数. msgget()函数创建一个消息队列或打开一个消息队列. #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h&

System V消息队列(2)

msgsnd函数 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由msgget函数返回的消息队列标识码 msgp:是一个指针,指针指向准备发送的消息, msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型 msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情 返回值:成功返回0:失败返回-1 msgs

利用System V消息队列实现回射客户/服务器

一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并与服务端进行通信: 2. 利用套接口描述符进行通信,必须知道对端的IP与端口. 二.相关函数介绍 下面,我们利用System V消息队列来实现进程间的通信: 首先,我们先来了解一下下面几个函数: 1. msgget: 该函数用于打开或创建消息队列,其作用相当与文件操作函数open. #include

Linux IPC实践(6) --System V消息队列(3)

消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid client进程发送的时候, mtype指定为自己进程的pid client进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收消息类型为自己pid的消息; // client/server进程接收/发送的数据结构 const int MSGMAX = 8192; struct msgBuf

Linux IPC实践(5) --System V消息队列(2)

消息发送/接收API msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由msgget函数返回的消息队列标识码, 也可以是通过ipcs命令查询出来的一个已经存在的消息队列的ID号 msgp:是一个指针,指针指向准备发送的消息, msgsz:是msgp指向的消息长度, 注意:这个长度不含保存消息类型的那个long int长整型 msgflg:控制着当前消息队列满或到达系统上限时

Linux IPC实践(4) --System V消息队列(1)

消息队列概述 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机); 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值. 消息队列也有管道一样的不足: (1)每个消息的最长字节数的上限(MSGMAX); (2)系统中消息队列的总条数也有一个上限(MSGMNI); (3)每个消息队列所能够保存的总字节数是有上限的(MSGMNB) . 查看系统限制 cat /proc/sys/kernel/msgmax  #最大消息长度限制 cat /proc/sys

LINUX学习:System V消息队列

介绍: 1.消息队列提供了一个从一个进程向另外一个进程发送数据块的方法 2.每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 3.消息队列也有管道一样的不足,就是每个消息最大的长度是有上限的(MSGMAX),每个消息队列 的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也是有一个上限的.   每个IPC对象都在内核维护着一个数据结构, 消息不同于刘模式,消息是有边界的,消息都是被打包在一个一个的数据包里的. 那么我们看下消息队列结构:       消息队列有4

Linux进程间通信——使用System V 消息队列

消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度. 在Linux中使用消息队列 Linux提供了一系列消息队列的函数接口来让我们方便地使用它来实现进程间的通信. msgget 函数 创建和访问一个