SystemV消息队列

SystemV消息队列

   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,分别用于删除队列,修改队列参数,获得队列参数。


   

    

你可能感兴趣的:(SystemV消息队列)