消息队列:
类似于有名管道,使用消息队列的进程也不必具备亲缘关系,任意两个进程间均可以使用消息队列通信。
不过消息队列独立于发送和接收的进程,因此就不必考虑同步的问题,这一点相对有名管道而言是一个优势。
消息队列以数据块传送数据,每个数据块是一个以长整型开头的结构体。
消息队列的几个方法如下:
int msgget(key_t key, int msgflg);
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">此方法成功执行会返回新的消息队列描述符,否则返回-1.key是和描述符相关的键值,当key是IPC_PRIVATE时,会返回一个新私有队列的描述符,理论上只能当前进程访问。当key是一个普通的键值时,方法会返回key值对应的队列描述符,当队列不存在时,而msgflg制定了IPC_CREAT,方法会返回一个与该键值相关的新的描述符。所以msgflag是权限标志,一般情况都和IPC_CREAT做或操作。</span>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
此方法是控制消息队列的方法。msqid就是上一个方法返回的描述符,cmd是对消息队列所进行的操作
IPC_STAT 把消息队列的关联值复制到buf
IPC_SET 把消息队列的关联值设置为buf指向的值
IPC_RMID 删除消息队列
<span style="font-size:18px;">int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);</span>
struct my_mess{
long int mess_type;
char my_text[SIZE];
};
msgsz是数据块的大小,msgflg用于控制当前消息队列满或者队列消息到达系统范围的限制时将要发生的事情。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
下面是一个小案例:
messsend.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<unistd.h>
#define SIZE 1024
struct my_mess{
long int mess_type;
char my_text[SIZE];
};
void main(){
int mess_id;
char buff[SIZE];
struct my_mess mess;
mess_id=msgget((key_t)1234,0666|IPC_CREAT);
if(mess_id==-1){
printf("create message failed!\n");
exit(EXIT_FAILURE);
}
while(1){
printf("send>> ");
fgets(buff,SIZE,stdin);
mess.mess_type = 1;
strcpy(mess.my_text,buff);
if(msgsnd(mess_id,(void *)&mess,SIZE,0)==-1){
printf("send message failed!\n");
exit(EXIT_FAILURE);
}
if(strncmp(buff,"quit",4)==0)break;
}
exit(EXIT_SUCCESS);
}
messreceive.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<sys/stat.h>
#include<unistd.h>
#define SIZE 1024
struct my_mess_t{
long int my_mess_type;
char mess_text[SIZE];
};
void main(){
struct my_mess_t mess;
int mess_id;
char buff[SIZE];
long int mess_rec = 0;
mess_id = msgget((key_t)1234,0666|IPC_CREAT);
if(mess_id==-1){
printf("create message error!\n");
exit(EXIT_FAILURE);
}
while(1){
if(msgrcv(mess_id,&mess,SIZE,mess_rec,0)==-1){
printf("receive mess failed!\n");
exit(EXIT_FAILURE);
}
printf("receive:%s",mess.mess_text);
if(strncmp(mess.mess_text,"quit",4)==0)break;
}
if(msgctl(mess_id,IPC_RMID,0)==-1){
printf("delete mess failed!\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
执行结果:
以上内容参考博客:
http://blog.csdn.net/ljianhui/article/details/10287879,不对之处还请大家批评指正!