1,消息队列从本质上讲就是一个链表,一个消息的链表。
2,消息队列通信主要步骤:
(1),通过ftok()获取一个键值;
(2),通过这个键值创建一个消息队列,并将消息队列与键值相关联。通过message get:msgget( )函数来创建。
(3),操作消息队列:发送消息,message send:msgsnd()与接收消息,receive message:msgrcv().
(4),删除消息队列:msgctl().
3,创建消息队列
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
int msgget(key_t key, int msgflg);
msgflg,操作与权限,IPC_CREAT | 0666
4,发送消息,msgsnd()
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
(1)msqid是msgget()函数返回的消息队列描述符,表示你要把消息队列发送到哪个消息队列里面去。
(2)msgp是一个指向struct msgbuf 型结构体的指针,表示你要把发送的消息存放到哪种类型的结构体变量中。固定格式的
struct msgbuf
{
long mtype;//消息类型,必须大于0;
char mtext[消息长度];//消息内容
};
(3),msgsz:表示要发送或接收的消息的字节数,即msgbuf中存放消息的mtext数组的长度,通过sizeof即可获得。
(4),msgflg:折个参数依然是控制函数行为的标志。
5,接收消息:
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
6,删除消息队列:msgctl()
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
① 参数shmid表示要控制的是哪个消息队列,即msgget()函数的返回值;
② 参数cmd如果取IPC_RMID就表示删除消息队列,即remove ID。我们一般使用shmctl()函数就是删除消息队列,所以cmd一般都取IPC_RMID,其它参数我们就不看了。PC_RMID的宏值为0,我们在编程的时候可以写宏名也可以直接写宏值,这里直接写宏值好像更方便一点,但含义没有宏名直观。
③ 参数struct msqid_ds *是一个结构体指针,同样这个参数一般就写NULL。
举例:
# include <unistd.h>
# include <sys/types.h>
# include <sys/ipc.h>ls
# include <sys/msg.h>
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
struct msgbuf
{
long mtype; /*消息类型,必须大于0 */
char mtext[1024]; /*消息内容*/
};
int main(void)
{
//获取键值
int key = ftok(".", 1);
//创建消息队列
int msgid = msgget(key, IPC_CREAT | 0666);
//发送消息
struct msgbuf data;
data.mtype = 3;
strcpy(data.mtext, "i love you");
msgsnd(msgid, &data, 1024, 0);
return 0;
}
# include <unistd.h>
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
struct msgbuf
{
long mtype; /*消息类型,必须大于0 */
char mtext[1024]; /*消息内容*/
};
int main(void)
{
//获取键值
int key = ftok(".", 1);
//打开消息队列
int msgid = msgget(key, IPC_CREAT);
//接收消息
struct msgbuf data;
msgrcv(msgid, &data, 1024, 3, 0);
printf("%s\n", data.mtext);
//删除消息队列
msgctl(msgid, 0, NULL);
return 0;
}