70-Linux_消息队列

消息队列

  • 一.什么是消息队列
  • 二.消息队列的原理
  • 三.消息队列的函数接口
    • 1.msgget
    • 2.msgsnd
    • 3.msgrcv
    • 4.msgctl
  • 四.消息队列的使用

一.什么是消息队列

消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的资料,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它.

二.消息队列的原理

70-Linux_消息队列_第1张图片

三.消息队列的函数接口

1.msgget

int msgget(key_t key, int msqflg);
msgget()创建或者获取一个消息队列
msgget()成功返回消息队列 ID,失败返回-1
msqflg: IPC_CREAT

2.msgsnd

int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);
msgsnd()发送一条消息;
//参数意义:
msqid:消息队列的id,因为系统中可能有多个消息队列,这id指明往哪个消息队列中添加数据;
msqp:往消息队列中添加的结构体,消息结构为:
struct msgbuf
{
long mtype; // 消息类型, 必须大于0(或者说>=1),长整型,比如图中的1,2>
char mtext[1]; // 消息数据 ,用户自己定义,可以是任何类型;这里存放消息数据
};
msqsz: 指定 mtext 中有效数据的长度//注意仅仅只接收的数据的大小,不包含消息类型的大小;
msqflg:一般设置为 0 可以设置 IPC_NOWAIT
msgsnd()成功返回0,失败返回-1;

3.msgrcv

ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp,
int msqflg);
msgrcv()接收一条消息
msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1,
msgp:接收消息的结构体,一般约定好,写入什么,接收什么结构体;
msqsz:接收消息的大小,大于等于发送的消息大小,一般和发送的消息大小一样.
msqtyp: 指定接收的消息类型(图中的1和2),类型可以为 0,为0表示不区分消息类型,按顺位接收消息;
msqflg: 一般设置为 0 可以设置 IPC_NOWAIT

4.msgctl

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msgctl()控制消息队列,也就是对消息队列做一个控制,可以设置消息队列,也可以移除消息队列;
msgctl()成功返回 0,失败返回-1
cmd: IPC_RMID
buf:设置或者获取消息队列需要的一个结构体,如果删除就直接给一个NULL;

四.消息队列的使用

进程a发送一条消息,进程b读取消息
//a.c

#include
#include
#include
#include
#include
#include

struct mess
{
    long type;
    char buff[128];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    assert(msgid!=-1);

    struct mess dt;
    dt.type=1;//消息类型
    strcpy(dt.buff,"hello");

    msgsnd(msgid,&dt,128,0);

    exit(0);
}

//b.c

#include
#include
#include
#include
#include
#include

struct mess
{
    long type;
    char buff[128];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    assert(msgid!=-1);

    struct mess dt;
    
    msgrcv(msgid,&dt,128,1,0);//1代表消息类型,当消息类型为0时,可以接受所有类型的消息
    printf("read mess:%s\n",dt.buff);

    exit(0);
}

ipcs -q /-m/-s
ipcrm 删除
如果设置成IPC_NOWAIT,没有消息不等待
没有0号消息;0表示顺位接收;不管什么类型的消息都接收,因为没有0号消息,只有>=1的消息;

你可能感兴趣的:(开发语言,linux)