进程间通信 消息队列基础

1.消息队列的介绍

1.1消息队列是采用链表的形式实现的队列,该链表由系统内核进行维护

1.2系统中[有很多个消息队列,每个消息队列用消息队列描述符(消息队列的ID:qid)来区分,qid是唯一的,用来区分不同的消息队列

1.3在进行进程间通信的时候,一个进程将消息加到队列的尾端,另一个进程从队列头部读(不一定是只能读取队列的头部消息,只是从头部开始读,通俗来讲就是从头部开始往下挑)

2.消息队列的接口函数

2.1创建消息队列

key:消息队列的标识符

msgflg:创建的标志,例如 IPC_CREAT

IPC_CREAT:如果不存在,就创建 再按位或(|)权限例如0664(八进制数)

返回值:成功返回队列ID 失败返回-1

2.2发送消息

msgid:消息队列的ID

msgp:指向结构体msgbuf的指针,用来指定发送的信息

         操作系统为该函数发送信息定义了发送格式,只是定义了一部分,另一部分还要程序员自己定义

msgsz:要发送的长度(内容的长度),结构体里char类型的长度,不用管结构体的大小

msgflg:创建标记,如果指定IPC_NOWAIT,如果失败会立即返回

            0:阻塞发送

            IPC_NOWAIT:非阻塞发送

返回值:成功返回0;失败返回-1

2.3接收消息

msqid:消息队列的id

msgp:指向结构体的指针

msgsz:要接收消息的长度,长度是msgp参数指向的结构体成员mtext的最大长度

msgtyp 也有3种方式:msgtyp:接收消息的方式
1. msgtyp = 0:读取队列中的第一条消息
2. msgtyp > 0:读取队列中类型为msgtyp 的第一条消息,除非在msgflg 中指定了MSG_EXCEPT否则将读取类型不等于msgtyp的队列中的第一条消息(意思就是加了这个宏之后,偏偏就不读msgtyp类型的消息)
3. msgtyp < 0:读取队列中最小类型小于或等于msgtyp 绝对值的第一条消息

解释:假设msgtyp是-3,那么读的时候就会读取小于等于3的第一条消息

msgflg:创建标记,如果指定IPC_NOWAIT,获取失败会立刻返回
返回值:成功返回实际读取消息的字节数,失败返回-1,并设置erron

接收消息也是从消息队列里拿,拿走就没有了.

接收消息也时阻塞状态,如果没有拿到这个类型的消息,就会阻塞掉,函数就不会退出

消息队列的生命周期是跟随系统的,如果一直往消息队列里发送,消息队列里的内容会不断增加

2.4操作消息队列的接口

msqid:消息队列的id

cmd:控制命令  IPC_RMID(删除命令)  IPC_STAT(获取标志)

buf:存储消息队列的相关信息

返回值:成功根据不同的cmd有不同的返回值失败返回-1 

3代码验证

3.1往消息队列里传内容

    
#include<stdio.h>
    2 #include<sys/msg.h>
    3 #include<stdlib.h>
    4 #include<string.h>
E>  5 struct msgbuf{
    6     long mtype;
    7     char mtext[100];
    8 };
    9 int main()
   10 {
   11     //创建消息队列
   12     int mid=msgget(0x12121212,IPC_CREAT|0664);
   13     printf("id==%d\n",mid);
   14     if(mid<0)
   15     {
   16         return 0;
   17     }
   18     //往消息队列里发送消息                                      
   19     struct msgbuf ms;
   20     ms.mtype=1;
   21     char str[]="i am write";
   22     strcpy(ms.mtext,str);
   23     msgsnd(mid,&ms,100,0);
   24     return 0;
   25 }

从消息队列里拿内容

#include<stdio.h>
    2 #include<sys/msg.h>
    3 #include<stdlib.h>
    4 #include<string.h>
E>  5 struct msgbuf{
    6     long mtype;
    7     char mtext[100];
    8 };
    9 int main()
   10 {
   11     //创建/获取消息队列
   12     int mid=msgget(0x12121212,IPC_CREAT|0664);
   13     printf("id==%d\n",mid);
   14     if(mid<0)
   15     {
   16         return 0;
   17     }
   18     //消息队列里拿信息
   19     struct msgbuf ms;
   20     msgrcv(mid,&ms,100,1,0);                                    
   21     printf("%s\n",ms.mtext);
   22     return 0;
   23 }

结果

当再次执行读的程序时,会阻塞掉,因为消息队列里没有数据了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值