消息队列通讯
来源:互联网 发布:数据库设计第三范式 编辑:程序博客网 时间:2024/05/22 14:29
一、消息队列概念:
消息队列就是一个消息的链表。而一条消息可以看做一个记录,具有特定的格式,进程可以按照一定的规则添加新消息,另一个进程可以从消息队列中独自消息。
二、消息队列函数
1.创建/打开消息队列
man msgget(key_t key , int msgflg)
返回值:
成功:返回消息队列的ID“
失败 : 失败返回-1
失败 : 失败返回-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
- 消息队列通讯编程
- 消息队列通讯
- 进程间通讯--消息队列
- Linux消息队列通讯编程
- Linux进程通讯:消息队列
- 进程间通讯-消息队列
- 进程间通讯:消息队列
- NET中使用消息队列通讯
- 进程间通讯--消息队列
- Linux进程间通讯之消息队列
- 进程间通讯--消息队列
- 进程间通讯--消息队列
- Linux进程间通讯之消息队列
- RabbitMQ 消息队列服务器 进程通讯
- 通过消息队列实现线程间通讯
- Linux进程间通讯之消息队列
- 进程间通讯之消息队列
- linux进程间通讯-消息队列
- 如果时间不够 ,无法进行充分的测试怎么办?
- c专家编程3、4章读书笔记
- 共享内存
- 在类中使用类成员函数创建线程
- [莫队算法] WHU Problem 1605 - Distance on Tree
- 消息队列通讯
- Unable to get package info for [包路径]; is package not installed
- HDU 1253
- 由于没有详细了解Timestamp和Date之间的关系犯的错
- 自定义View,ViewGroup
- 多线程程序设计
- JVM系列2:垃圾收集器与内存分配策略
- TCP/IP卷一(第二章学习)
- 科技漫谈——无人机