msgrcv()函数特性

操作系统提供的消息队列收发函数,接收函数有一个特性,以前一直没理解清楚,今天测试确认了。

函数:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

参数说明

msqid:消息队列的识别码。
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下

struct msgbuf {
    long mtype;     /* 消息类型,必须 > 0 */
    char mtext[1];  /* 消息文本 */
};

msgsz:消息的大小。
msgtyp:从消息队列内读取的消息形态。

msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。

特性说明:

msgsnd()时,第二个参数(输入参数)msgp是个结构体指针,指向内容有两个字段,mtype表示消息类型,mtext表示参数内容,内容长度一般不能太大,占用的是操作系统的消息队列空间。

msgrcv()时,第二个参数(输入参数)msgp用来接收消息内容,第4个参数用msgtype来指定消息类型,即从同一个msgqid里面可以接收不同类型的消息,这个msgtype官方说明如下:

The argument msgtyp specifies the type of message requested as follows:
       * If msgtyp is 0, then the first message in the queue is read.
       * If msgtyp is greater than 0, then the first message in the queue of type msgtyp  is  read,  unless  MSG_EXCEPT  was
         specified in msgflg, in which case the first message in the queue of type not equal to msgtyp will be read.
       * If  msgtyp is less than 0, then the first message in the queue with the lowest type less than or equal to the abso-
         lute value of msgtyp will be read.

为0时,就是接收队列里的第一个消息,绝对是第一个消息;

>0时,接收队列中第一个类型为msgtype的消息,这里不一定是队列首个消息,可以读取队列里第2、3、....个消息,这个经过测试验证过了。

<0时,接收队列中第一个小于、等于|msgtype|的消息,不一定是第一个消息,如果队首消息大于|msgtype|将不会被取走。

结论:

操作系统提供的消息队列,确保同一个类型的消息是先进先出的,整个队列的消息可能不是先进先出的。

你可能感兴趣的:(msgrcv()函数特性)