消息队列编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列编程相关的知识,希望对你有一定的参考价值。

消息队列编程

消息队列通讯

11.1 创建、打开消息队列

11.1.1 函数名

msgget

11.1.2 函数原形

Int msgget(key_t key,int msgflg)

11.1.3 函数功能

打开或者创建消息队列

11.1.4 所属头文件

<sys/tpes.h>

<sys/ipc.h>

<sys/msg.h>

11.1.5 返回值

成功:返回消息队列id

失败:-1

11.1.6 参数说明

Key:键值

Msgflg:打开标志。IPC_CREAT:表明新创建一个消息队列

 

 

11.2 发送数据

11.1.1 函数名

msgsnd

11.1.2 函数原形

Int msgsnd(int msgid,const void *msgp,size_t msgsz,int msgflg)

11.1.3 函数功能

发送消息到消息队列

11.1.4 所属头文件

<sys/types.h>

<sys/ipc.h>

<sys/msg.h>

11.1.5 返回值

成功:0

失败:-1

11.1.6 参数说明

Msgid:消息队列的id

Msgp:指向要发送的消息

Msgsz:消息的长度

Msgflg:标志位

 

11.3 从消息队列中取消息

11.3.1 函数名

msgrcv

11.3.2 函数原形

Ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg)

11.3.3 函数功能

从消息队列中接收消息

11.3.4 所属头文件

<sys/types.h>

<sys/ipc.h>

<sys/msg.h>

11.3.5 返回值

成功:实际接收到的消息的数据长度

失败:-1

11.3.6 参数说明

Msgid:消息队列的id

Msgp:存放取出的消息

Msgsz:希望取到的消息的对打长度

Msgtyp:消息的类型。

0:忽略类型,直接取队列中的第一条消息。

>0:取消息队列中类型等于msgtyp的第一条消息

<0:取类型比msgtyp的绝对值要小或者等于的消息,如果有多条消息满足该条件,则取类型最小的一条。

Msgflg:标志

 

 

11.4 删除消息队列

11.4.1 函数名

msgctl

11.4.2 函数原形

Int msgctl(int msqid,int cmd,struct msqid_ds *buf)

11.4.3 函数功能

控制消息队列

11.4.4 所属头文件

<sys/types.h>

<sys/ipc.h>

<sys/msg.h>

11.4.5 返回值

成功:0

失败:-1

11.4.6 参数说明

Msqid:消息队列的id

Cmd:对消息队列执行的操作命令,IPC_RMID用于删除消息队列

Buf:获取内核中的msqid_ds结构

 

msg_queue_send.c

技术分享
 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/ipc.h>
 4 #include <sys.msg.h>
 5 
 6 struct msgt
 7 {
 8     long msgtype;
 9     char msgtext[1024];
10 };
11 
12 int main()
13 {
14     int msqid;
15     int msg_type;
16     //创建消息队列
17     msqid = msgget(1024,IPC_CREAT);
18     char str[256];
19     struct msgt msgs;
20     
21     //循环
22     while(1)
23     {
24         printf("please input message type,0 for quit!\n");
25         //获取消息类型
26         scanf("%d",&msg_type);
27         //如果用户输入的消息类型为0,退出该循环
28         if(msg_type == 0)
29         {
30             break;
31         }
32         //获取消息数据
33         printf("please input message content\n");
34         scanf("%s",str);
35         msgs.type = msg_type;
36         strcpy(msgs.msgtext,str);
37         //发送消息
38         msgsnd(msqid,&msgs,sizeof(struct msgt),0);
39         
40     }
41 
42     msgctl(msqid,IPC_RMID,0);
43     //删除消息队列
44 
45     return 0;
46 
47 }
msg_queue_send.c

 

msg_queue_receive.c

技术分享
 1 #include <stdio.h>
 2 #include <sys/ipc.h>
 3 #include <sys/types.h>
 4 #include <sys/msg.h>
 5 
 6 int msqid = 0;
 7 
 8 struct msgt
 9 {
10     long msgtype;
11     char msgtext[1024];
12 };
13 void childprocess()
14 {
15     struct msgt msgs;
16 
17     while(1)
18     {
19         //接收消息队列
20         msgrcv(msqid,&msgs,sizeof(struct msgt),0,0);
21     
22         //打印消息队列中的数据
23         printf("msg text: %s\n",msgs.msgtext);
24     }
25     return;
26 }
27 
28 int main()
29 {
30     int i;
31     int cpid;
32     //打开消息队列
33     msqid = msgget(1024,IPC_EXCL);
34 
35     //创建3个子进程
36     for(i=0;i<3;i++)
37     {
38         cpid = fork();
39         if(cpid < 0)
40         {
41             printf("creat child process error!\n");
42         }
43         else if(cpid == 0)
44         {
45             childprocess();
46         }
47     }
48     
49     return 0;
50 }
msg_queue_receive.c

 

以上是关于消息队列编程的主要内容,如果未能解决你的问题,请参考以下文章

消息队列的简单理解

RabbitMQ✧消息队列

关于消息队列的使用(转载)

IPC之消息队列·即时通讯小程序

分布式消息队列应用场景之异步处理应用解耦流量削锋和消息通讯理解分析

消息队列简介