system v--消息队列

来源:互联网 发布:unity3d特效 编辑:程序博客网 时间:2024/04/27 18:10

消息队列相关操作涉及到的几个主要函数

1、创建消息队列

int msgget( key_t key, int msgflg);

参数key:是一个键值,由ftok获得. key_t ftok(const char *pathname, int proj_id);

参数msgflg:标志位,可以是IPC_CREAT、IPC_EXCL、IPC_NOWAIT的组合

函数返回:返回与键值key对应的消息队列描述字,失败返回-1。

 

2、写消息队列:

int msgsnd( int msgid, const void* msg, size_t len, int flag);

参数msgid:消息ID的标志

参数msg:将要发送的消息

参数len:发送的消息长度,不包括消息类型的长度哟!!!

参数flag:

         IPC_NOWAIT--在消息队列没有足够的空间来容纳消息时,msgsnd是否等待

函数返回:0表示成功,-1表示失败

 

3、读消息队列:

size_t msgrcv( int msgid, void* msg, size_t len, long msgtype, int flag);

参数msgid:消息ID的标志

参数msg:接收到的消息

参数len:接收的消息长度

参数msgtype:读取的消息类型

      0  返回消息队列中的第一个消息

      >0 返回消息队列中类型为msgtype的第一个消息

      <0 返回消息队列中绝对值小于msgtype的类型值最小的一个消息

参数flag:

     IPC_NOWAIT 如果没有满足条件的消息,调用立即返回,此时,errno=ENOMSG

  IPC_EXCEPT 与msgtyp>0配合使用,返回队列中第一个类型不为msgtype的消息

  IPC_NOERROR 如果队列中满足条件的消息内容大于所请求的len字节,则把该消息截断,截断部分将丢失。

函数返回:成功则返回消息的数据部分长度,失败则返回-1

注:上面的参数中提到了消息类型,实际上消息队列中的每一个元素的结构都是如下的样子:

struct msgtype {

    long mtype;  // 头4个字节表征了消息类型

    char buffer[];  // 实际传播的消息数据

};

 

4、消息队列控制:

int msgctl( int msgid, int cmd, struct msqid_ds* buf);

struct msqid_ds

{

 struct ipc_perm msg_perm;     /* Ownership and permissions */

 time_t          msg_stime;    /* Time of last msgsnd(2) */

 time_t          msg_rtime;    /* Time of last msgrcv(2) */

 time_t          msg_ctime;    /* Time of last change */

 unsigned long   __msg_cbytes; /* Current number of bytes in

                                 queue (non-standard) */

 msgqnum_t       msg_qnum;     /* Current number of messages

                                 in queue */

 msglen_t        msg_qbytes;   /* Maximum number of bytes

                                 allowed in queue */

 pid_t           msg_lspid;    /* PID of last msgsnd(2) */

 pid_t           msg_lrpid;    /* PID of last msgrcv(2) */

};

参数msgid:消息ID标志

参数cmd: IPC_STAT 用来获取消息队列的相关信息,并将信息存储在buf中

   IPC_SET  用来设置消息队列的属性,要设置的属性填充在buf中,注意并不是每个属性都可以设置

   IPC_RMID 用来删除消息ID为msgid的消息队列

参数buf: msqid_ds结构

函数返回:成功则返回0,失败返回-1

 

5、系统中消息队列的几个限制

一个消息队列中最大容纳的消息数量:

一个消息队列占用的空间数量:MSGMNB

一个消息队列中的单个消息的最大长度:MSGMAX

系统中支持的最大消息队列数:

原创粉丝点击