消息队列:
简介:
消息队列同管道一样为进程间通信提供了一种有效的方式。它的优势在于它独立于发送和
接收进程而存在,它不受读写端是否关闭而影响。消息队列有相关类型,我们可以选择
接收什么样的类型。
1.消息队列的函数头文件#include<sys/msg>
int msgget(ket_t key,int msgflg)
与大多数IPC机制一样,key相当于它的名字,flg多取IPC_CREAT,返回的如同相应文件的
标识符,如果已有就直接打开没有就建立,与open系统调用类似。
int msgsnd(int msqid, const void *msg_ptr,size_t msg_sz,int msgflg)
struct
这个函数用来向消息队列发送消息,第一个参数就是IPC机制的通用意思就是文件标识符。
第二个参数是待发送消息的指针,这个指针我们可以定义成为如下的结构体。
struct mess
{
long int type;
xx buff[xx];
}
但该指针要求从type类型开始,所以我们可以做这样定义。第三个参数是不包括长整形
参数在内的消息长度。第四个参数是控制如果消息队列满了我们如何应答,如果设置
IPC_NOWAIT标志,函数立刻返回-1.如果没有则进程将被挂起等待有相应类型的消息。
int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg)
前三个参数都如上,最后一个参数如上如果选择IPC_NOWAIT就是直接返回-1,如果选择0
相同效果第四个参数取0,其实就是接受所有信息,想接受那个类型的信息就填数字几,
如果想接受小于数字n的消息可以填-n。
int msgctl(int msqid,int command,struct msqid_ds *buf)
第一个参数取标识符,第二个有三个参数IPC_RMID为删除消息队列。第三个参数是
和第二个参数其他选项配合使用的。
程序:
接收
struct mess
{
long type;
char buff[128];
};
int main()
{
int msgid=msgget((key_t)1234,IPC_CREAT|0600);
assert(msgid!=-1);
struct mess dt;
msgrcv(msgid,(void *)&dt,128,1,0);
printf("buff=%s\n",dt.buff);
}
发送
struct mess
{
long type;
char buff[128];
};
int main()
{
int msgid=msgget((key_t)1234,IPC_CREAT|0600);
assert(msgid!=-1);
struct mess dt;
dt.type=1;
printf("input:\n");
char buff[128]={0};
fgets(buff,128,stdin);
strcpy(dt.buff,buff);
msgsnd(msgid,(void *)&dt,128,0);
}
本程序为了简介将char设为1号消息类型。