红联Linux门户
Linux帮助

linux消息队列的使用

发布时间:2016-09-06 15:21:18来源:linux网站作者:zzmx
消息队列
*消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容。消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识。
 
msgbuf结构
struct msgbuf{
long mtype; //消息类型
char mtext[1];  //消息数据
};
 
msgid_ds结构
struct msqid_ds{
struct ipc_perm msg_perm;
time_t  msg_stime;  //发送到队列的最后一个消息的时间戳
time_t  msg_rtime;  //从队列中获取的最后一个消息的时间戳
time_t  msg_ctime;  //对队列进行最后一次变动的时间戳
unsigned long   __msg_cbytes;   //在队列上所驻留的字节总数
msgqnum_t   msg_qnum;   //当前处于队列中的消息数目
msglen_t    msg_qbytes; //队列中能容纳的字节的最大数目
pid_t   msg_lspid   //发送最后一个消息进程的PID
pid_t   msg_lrpid   //接收最后一个消息进程的PID
};
 
ipc_perm结构
struct ipc_perm{
key_t   key;    //函数msget()使用的键值
uid_t   uid;    //用户的UID
gid_t   gid;    //用户的GID
uid_t   cuid;   //建立者的UID
gid_t   cgid;   //建立者的GID
unsigned short  mode;   //权限
unsigned short  seq;    //序列号
};
 
键值构建ftok()函数
#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
//pathname必须是已经存在的目录
 
获得消息msgget()函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgget(key_t key, int msgflg);
/*第一个参数可以用ftok()函数生成
msgflg参数:
1.IPC_CREAT 如果内核中不存在该消息队列,则创建它
2.IPC_EXCL  当和IPC_CREAT一起使用时,如果队列早已存在则将出错
*/
 
发送消息msgsend()函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg);
/*
第一个参数从msgget()获得
第二个参数指向一个消息缓冲区
第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)
第四个参数设置成0表示忽略,设置成IPC_NOWAIT,如果消息队列已经满了,则消息不写进队列中,如果不设置则阻塞直到可以写消息为止
*/
 
接收消息msgrcv()函数
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
/*
第一个参数从msgget()获得
第二个参数消息缓冲变量的地址
第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)
第四个参数指定要从队列中获取的消息类型,内核查找队列中匹配类型的第一个到达的消息,如果传0则返回队列最早的消息,不管类型
第五个参数设置成IPC_NOWAIT,如果消息队列没有消息则返回ENOMSG,否则进程将阻塞直到满足条件的消息到达,如果客户等待消息的时候队列被删除则返回EIDRM,如果进程阻塞并等待消息的时候捕获信号则返回EINTR
*/
 
本文永久更新地址:http://www.linuxdiyf.com/linux/23941.html