(一)发行版:Ubuntu16.04.7
(二)记录:
(1)什么是消息队列
消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。
(2)msgget函数
头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>
函数原型:int msgget(key_t key,int msgflg);
参数:key_t key:和消息队列相关的key值
int msgflg:访问权限
返回值:成功返回消息队列的ID,失败-1
(3)msgctl函数
头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>
函数原型:int msgctl(int msqid,int cmd,struct msqid_ds *buf);
参数:int msqid:消息队列的ID
int cmd: IPC_STAT:读取消息队列的属性,然后把它保存在buf指向的缓冲区。
IPC_SET:设置消息队列的属性,这个值取自buf参数。
IPC_RMID:删除消息队列。
struct msqid_ds *buf: 消息队列的缓冲区
返回值:成功返回0,失败返回-1
(4)msgget创建消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
int main(void)
{
key_t key;
int msgid;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
return 0;
}
查看消息队列和删除消息队列
(查看共享内存ipcs -m)(删除共享内存ipcrm -m 'mid')
(5)msgsnd函数(发送消息)
头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>
函数原型:int msgsend(int msqid,const void *msgp,size_t msgsz,int msgfly)
参数:int msqid: 消息队列ID
const void *msgp: 指向消息类型的指针
size_t msgsz: 发送的消息的字节数
int msgflg: 如果为0,直到发送完成函数才返回,即阻塞发送
如果为IPC_NOWAIT:消息没有发送完成,函数也会返回,即非阻塞发送
返回值:成功返回0,失败返回-1
发送的格式:
struct msgbuf{
long mtype; //消息的类型
char mtext[1]; //消息的内容
}
(6)msgrcv函数(接收消息)
头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>
函数原型:ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg)
参数: int msqid:消息队列ID
void *msgp:接收消息的缓冲区
size_t msgsz:接收消息的字节数
long msgtyp:接收消息的标识 (写0即可,0代表接收消息队列中的第一个消息)
int msgflg: 0表示阻塞读取,IPC_NOWAIT表示非阻塞读取
返回值:成功返回接收到的消息的长度,失败返回-1
(7)通过消息队列进行消息的发送和读取
发送消息:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
//发送的格式:
struct msgbuf{
long mtype;
char mtext[128];
};
int main(void)
{
key_t key;
int msgid;
struct msgbuf msg;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
//发送消息
msg.mtype=1;
strncpy(msg.mtext,"hello",5);
msgsnd(msgid,&msg,strlen(msg.mtext),0); //第三个参数字节大小是正文的大小
return 0;
}
接收消息:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
struct msgbuf{
long mtype;
char mtext[128];
};
int main(void)
{
key_t key;
int msgid;
struct msgbuf msg;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
//接收消息
msgrcv(msgid,(void *)&msg,128,0,0);
printf("msg type is %ld.\n",msg.mtype);
printf("msg content is %s\n",msg.mtext);
return 0;
}
(三)命令: