消息队列:消息队列提供了一种在两个不相关的进程之家传递数据的简单且有效的方法,与命名管道相比,消息队列的优势在于,它独立于发送和接收进程。它提供了一种从一个进程向另一个进程发送一个数据块(结构体)的方法。(每个数据块都有一个最大长度的限制,系统中所有队列所包含的全部数据块的总长度也有一个上限)
-
读消息的时候消息类型“0”代表不区分消息类型,什么类型的消息都会被读出。
-
消息是先存在消息队列然后再被读出。
-
ipcs –q 只显示消息队列
头文件 #include<sys/msg.h>
所用到的函数:
1. msgget函数:用来创建和访问一个消息队列
Int msgget(key_t key, int msgflg);成功的时候返回一个正整数,即队列标识符,失败时返回-1. 第二个参数msgflg由IPC_CREAT定义的一个特殊位必须和权限标志按位或才能创建一个新的消息队列。
2 .msgsnd函数:用来把消息添加到消息队列中(4个参数)
Int msgsnd(int msgid, const void *msg_ptr,size_t msg_sz,int msgflg);
msgid:由messget函数返回的消息队列的标识符(往哪存)
msg_ptr:是一个指向准备发送消息的指针,消息必须以一个长整形成员变量开始
msg_sz:是msg_ptr指向的消息长度,这个长度不能包括长整形消息类型成员变量的长度
msgflg:标志,存消息的时候如果标志位位0,如果存满了就会阻塞退出
使用消息的时候把消息定义成结构体:
struct my_message
{
Long int message_type;
}
3.msgrcv函数:从消息队列中获取消息
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
msg_ptr: 是一个指向准备接收消息的指针,消息必须以一个长整形成员变量开始
msgflg: msgtype是一个长整形,它可以实现一种简单形式的接收优先级。如果它的值为0,就获取队列中的第一个可用消息,如
果它的值大于0,将获取相同类型消息的第一个消息,如果大于0,将获取消息类型等于或小于msgtype的绝对值的第一个消息
msgrcv函数成功的时候,msgrcv函数返回放到接收缓存区中的字节数,消息被复制到由msg_ptr指向的用户分配的缓存区中,然后
删除消息队列中的对应消息,失败时返回-1.
4.msgctl函数:
int msgctl(int msqid, int command, struct msqid_ds *buf);
command:是将要采取的动作
msqid_ds结构至少包括以下成员:
struct msqid_ds
{
uid_t msg_perm.uid;
uid_t msg_perm.gid;
uid_t msg_perm.mode;
}
main.c
#include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<assert.h>
5 #include<string.h>
6 #include<sys/msg.h>
7
8 struct mess
9 {
10 long int type;
11 char buff[32];
12 };
13
14 int main()
15 {
16 int msgid = msgget( (key_t)1234,IPC_CREAT|0600);
17 assert(msgid != -1);
18 struct mess dt;
19 dt.type = 1;
20 strcpy(dt.buff,"Hello1");
21
22 msgsnd(msgid,(void*)&dt,32,1);
23 exit(0);
25 }
test.c
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<assert.h>
5 #include<string.h>
6 #include<sys/msg.h>
7
8 struct mess
9 {
10 long int type;
11 char buff[32];
12 };
13
14 int main()
15 {
16 int msgid = msgget( (key_t)1234,IPC_CREAT|0600);
17 assert(msgid != -1);
18
19 struct mess dt;
20
21 msgrcv(msgid,(void*)&dt,32,1,0);
22
23 printf("buff=%s\n",dt.buff);
24 exit(0);
25 }
先执行main.c然后如果想要查看有几个消息队列就用ipsc(空格)-q,然后再执行打开一个Teminal执行test.c,就可以得到结果