SV消息队列使用消息队列标示符标示,无法使用select\poll IO多路服用模型,消息写入前不要求有进程等待该消息到达。ipcs -q指令可以查看系统现有消息队列
#include <sys/msg.h>
int msgget(ket_t key,int aflag) ;//成功返回非负标示符,失败返回-1
key可以使常值也可以由函数ftok产生,aflags是读写权限位(eg.S_IRUSR,S_IWUSR...),可以与上IPC_CREAT指定在不存在时创建或IPC_EXCL怕他性创建。
int msgsnd(int msqid,const void *ptr,size_t length,int flag);//成功返回0,出错返回-1
函数用于投递消息到指定队列,前三个参数分别是队列标示符,消息结构地址,消息长度,flag指定是否非阻塞调用(IPC_NOWAIT)。缓冲区模板为:
struct msgbuf{
long mtype;
char mtext[1];
}.//mtype指定消息类型,之后是消息内容,length指的是消息内容的长度,即sizoef(msgbuf)-sizeof(long).如果是非阻塞调用,当指定队列已满时线程被挂起,直到队列有新的空间或者队列被删除(返回EIDRM),或者线程被信号中断(返回EINTR)
ssize_t msgrcv(int msqid ,const void*ptr,size_t length,long type,int flag);//成功返回0,出错返回-1
函数用于读取一个消息,参数设置同msgsnd。对于type参数,
为0 返回队列中的第一个消息(FIFO)
为正数 返回该类型值的第一个消息
为负数 返回绝对值小于等于该值的消息中类型值最小的消息。由此多个进程可以复用单个消息队列而不互相干扰,也可用作优先级字段不必以先进先出的方式读取消息。
int msgctl(int msqid,int cmd,struct msqid_ds *buff);//成功返回0,失败-1
函数用于对一个消息队列进行操作,提供的命令有IPC_RMID,IPC_SET,IPE_STAT,分别用于删除队列,修改队列参数,获得队列参数。