消息队列通讯

来源:互联网 发布:数据库设计第三范式 编辑:程序博客网 时间:2024/05/22 14:29
一、消息队列概念:
                    消息队列就是一个消息的链表。而一条消息可以看做一个记录,具有特定的格式,进程可以按照一定的规则添加新消息,另一个进程可以从消息队列中独自消息。

                                                                                       
二、消息队列函数
              1.创建/打开消息队列
              man msgget(key_t key , int msgflg) 
                     返回值: 
                             成功:返回消息队列的ID“
                              失败  :   失败返回-1
                     参数:
                              key :键值
                              msgflg:打开标志,IPC_CREAT表明创建一个消息
                     2.发送数据
                  msgsnd(int msqid , const void  *msgp, size_t msgsz,int msgflg )
                 struct msgbuf {
                   long mtype;       /* message type, must be > 0 */  //表明消息的类型,可以根据消息类型的不同从消息队列中取出消息
                   char mtext[1];    /* message data */            //消息中数据
                };
               
                 功能:发送消息到消息队列
                  返回值: 
                               失败:-1
                               成功:0
             参数:
                        msqid:消息队列的id
                        msgq:指向要发送的消息,
                        msgsz:消息的长度,不包含类型
                        msgfg:标志位
                 3.从消息队列中接收消息
                          sszie_t msgrcv(int msqid , void *msgp , size_t msgsz , long msgtyp, int msgflg)
                      返回值:
                                失败:-1
                                成功:返回实际接收消息的长度
                      参数:
                                  msqid:消息队列的id
                                   msgp:存放取出的消息
                                   msgsz :取出消息的最大长度
                                   msgtyp:
                                                       =0  直接忽略类型,只取消息队列中的第一个消息
                                                       >0  取消息队列中类型等于msgtyp的第一条消息
                                                      <0    取消息队列中类型比msgtyp要小或者等于的消息,如果小多条消息满足条件,则取类型最小的类型
                                           msgflg:标志
                          4.从消息队列中删除消息
                               int msgct(int msqid , int cmd,struct msqid_ds* buf)
                               返回值:
                                            成功返回 0 
                                            失败  -1
                                 参数:
                                                msqid :消息队列的ID
                                                cmd:对消息队列要执行的命令,IPC_RMID用来删除消息队列
                                                  buf:获取内核中的msqid_ds结构,通常不用
三、消息队列综合实例:
                               
            A进程: 
                    1.创建消息队列
                    2. 
                            while循环
                                     2.1 从键盘中获取输入,包括消息的类型以及消息的数据
                                     2.2. 发送到消息队列
                    3.删除消息队列
send.c                  
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
 
/*定义消息的结构*/
struct msgbuf
{
long msgtype; //消息的类型
char msgtext[1024]; //消息数据
};
 
 
int main()
{
int msgid;
int msg_type;
char str[256];
struct msgbuf msgs;
 
//1.创建消息队列
msgid=msgget(1024,IPC_CREAT);
//2.
while(1)
{
printf("please input message type, 0 for quit !\n");
//2.1 获取消息类型
scanf("%d",&msg_type);
//2.2如果用户输入的消息为0 ,退出该循环
if(msg_type==0)
{
break;
}
//2.3获取消息数据
printf("please input message content\n");
scanf("%s",str);
msgs.msgtype=msg_type;
strcpy(msgs.msgtext,str);
//2.4发送消息
msgsnd(msgid,&msgs,sizeof(struct msgbuf),0);
}
//3 删除消息队列
msgctl(msgid,IPC_RMID,0);
return 0;
}
receicve.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
 
/*定义消息的结构*/
struct msgbuf
{
long msgtype; //消息的类型
char msgtext[1024]; //消息数据
};
 
 
int main()
{
int msgid;
int msg_type;
char str[256];
struct msgbuf msgs;
 
//1.创建消息队列
msgid=msgget(1024,IPC_CREAT);
//2.
while(1)
{
printf("please input message type, 0 for quit !\n");
//2.1 获取消息类型
scanf("%d",&msg_type);
//2.2如果用户输入的消息为0 ,退出该循环
if(msg_type==0)
{
break;
}
//2.3获取消息数据
printf("please input message content\n");
scanf("%s",str);
msgs.msgtype=msg_type;
strcpy(msgs.msgtext,str);
//2.4发送消息
msgsnd(msgid,&msgs,sizeof(struct msgbuf),0);
}
//3 删除消息队列
msgctl(msgid,IPC_RMID,0);
return 0;
}


0 0
原创粉丝点击