简单介绍:消息队列是存在于Linux内核里的,在进程结束了以后也依然会存在,是独立于进程外的,而且消息队列里的消息是不遵循什么先入后出啊后入先出的顺序的,而且每段消息都可以定义类型,但这里的类型并不是说什么int型,char型什么的,而是一串自定义的数字,可以是3,10,899,任意的一个数字,读取消息的时候就可以通过类型来寻找这个消息,当然也不会光靠类型来找,既然要读取信息,那肯定先确定那一条队列,所以要读取信息,肯定是通过队列号和类型,这两个条件来寻找的。
.
下面先介绍一下具体需要使用的函数:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//创建或打开消息队列:成功返回队列 ID ,失败返回 -1
int msgget(key_t key, int msgflg);
//添加消息:成功返回 0 ,失败返回 -1
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//读取信息:成功返回消息数据的长度,失败返回 -1
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
//控制消息队列:成功返回 0 ,失败返回 -1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
然后,直接上实例:
先说一下大概的程序运行过程,首先有两个程序,程序A和程序B一个获取消息,一个发送消息(假设A发送,B接收)在确认接收到消息以后,互换身份,发送变接收,接收变发送(即A接收,B发送)
.
程序A的代码:
struct msgbuff{ //消息队列的消息的形式以结构体体现
long mtpye; //消息的类型
char mtext[128]; //消息的内容
}
int main()
{
key_t msg_key = 0;
msg_key = ftok(".",6); //生成一个键值
int msgid = 0;
msgid = msgget(msg_key,IPC_CREAT|0777); //创建或打开一个队列,并设定权限0777(可读可写可执行)
if(msgid == -1){peintf("creat msgid failed!\n");} //创建失败时则提示
struct msgbuff sndbuff = {500,"njl shi zhen de shuai"}; //500是消息的类型,后面的字符串是消息的内容
msgsnd(msgid,&sndbuff,strlen(sndbuff.mtext),0); //参数依次是:队列的id,消息的结构体,消息内容的长度,以什么方式发送,0是默认阻塞
printf("tips:send ok\n"); //发送后的提示信息
struct msgbuff rcvbuff; //声明一个用来接收信息的结构体
msgrcv(msgid,&rcvbuff,sizeof(char)*128,899,0); //和发送的函数差不多,只不过在长度后面多了一个参数,是接收信息的类型,用于找到信息,并且和第一次发送的信息类型不一样
printf("-->%s\n",rcvbuff.mtext); //打印获取到的信息内容
struct msgbuff sndbuff2 = {500,"good good study"}; //这里命名了一个接收信息的结构体,注意看它也是500的,和第一次发送的消息是一样的类型,这里我是想试一下看另一个程序读取到的信息会是第一次发送的还是这次发送的,是否能更新,能否正常接收。
msgsnd(msgid,&sndbuff2,strlen(sndbuff2.mtext),0);
printf("tips:send 2 ok\n");
}
.
程序B的代码:
struct msgbuff{
long mtpye;
char mtext[128];
}
int main()
{
key_t msg_key = 0;
msg_key = ftok(".",6);
int msgid = 0;
msgid = msgget(msg_key,IPC_CREAT|0777);
if(msgid == -1){peintf("creat msgid failed!\n");}
struct msgbuff rcvbuff;
msgrcv(msgid,&rcvbuff,sizeof(char)*128,500,0);
printf("-->%s\n",rcvbuff.mtext);
struct msgbuff sndbuff = {899,"thank u, my pretty girl"};
msgsnd(msgid,&sndbuff,strlen(sndbuff.mtext),0);
printf("tips:replied\n");
struct msgbuff rcvbuff2;
msgrcv(msgid,&rcvbuff2,sizeof(char)*128,500,0);
printf("-->%s\n",rcvbuff2.mtext);
}
最后程序运行的结果是可以的,第二次发送的类型为500的信息是能正常收到的并且是第二次发送的内容。
.
其余的也没有什么号探讨的了,这个运用起来比较简单,就先到这里了,后面用久了有什么新发现再更新吧