消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。消息队列是存放在内核中的,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正删除。操作消息队列时用到的数据结构主要有msgbuf、msqid_ds和ipc_perm。
msgbuf的定义如下。
在结构中共有两个元素:mtype指消息的类型,由一个整数代表,并且它只能是整数。mtext是消息数据本身。
msqid_ds的定义如下。
各字段的含义如下。
●msg_perm:是一个ipc_perm的结构,保存了消息队列的存取权限、队列的用户ID和组ID等信息。
●msg_first:指向队列中的第一条消息。
●msg_last:指向队列中的最后一条消息。
●msg_stime:发送到队列中的最后一条消息的时间。
●msg_rtime:从队列中读取的最后一条消息的时间。
●msg_ctime:是队列最后一次改动的时间。
●msg_cbytes:是队列中所有消息的总长度。
●msg_qnum:是当前队列中的消息的数目。
●msg_qbytes:队列中的最大的字节数。
●msg_lspid:发送最后一条消息的进程ID。
●msg_lrpid:读取队列中最后一条消息的进程ID。
ipc_perm的定义如下。
与消息队列处理相关的函数主要有以下几种。
1.msgget()(www.xing528.com)
msgget()函数原型为
该函数中的参数key用来转换成一个标识符。每一个IPC对象与一个key对应。参数flags用来决定消息队列的存储权限。
2.msgrcv()
函数msgrcv()可以从队列中读取消息。该函数原型为
其中参数msqid为指定要读的队列;参数ptr为要接收数据的缓冲区;nbytes为要接收数据的长度,当队列中满足条件的消息长度大于nbytes的值时,则会参照行为参数flag的值决定如何操作:当flag中设置了MSG_NOERROR位时,则将消息截短到nbytes指定的长度后返回。如没有MSG_NOERROR位,则函数返回出错,并设置错误变量errno。设置type参数可指定msgrcv()函数所要读取的消息。tyre的取值及相应操作见表9-5。
表9-5 type的取值及相应操作
参数flag用于定义函数的行为,如设置了IPC_NOWAIT位,则当队列中无符合条件的消息时,函数出错返回,errno的值为ENOMSG。如没有设置IPC_NOWAIT位,则进程阻塞,直到出现满足条件的消息为止,然后函数读取消息返回。
3.msgsnd()
由于消息队列的特殊性,系统为这个数据类型提供了两个接口(msgsnd()函数,msgrcv()函数),分别对应写消息队列及读消息队列。
函数msgsnd()的作用是写消息队列。该函数原型为:
对于写入队列的每一条消息都含有3个值:正长整型的类型字段、数据长度字段和实际数据字节。新的消息总是放在队列的尾部。函数中的参数msqid指定要操作的队列,ptr指针指向一个msgbuf的结构,这是一个模板的消息结构。
函数中的参数nbytes指定了消息的长度,参数flags指明函数的行为。若函数成功,则返回0,否则返回-1,并设置错误变量errno。errno可能出现的值有EAGAIN、EACCES、EFAULT、EIDRM、EINTR、EINVAL和ENOMEM。当函数成功返回后,会更新相应队列的msqid_ds结构。
4.msgct1()
函数msgctl()可以在队列上做多种操作。该函数原型为:
参数msqid为指定的要操作的队列。参数cmd指定所要进行的操作,其中有些操作需要buf参数。cmd参数的取值及操作见表9-6。
表9-6 cmd参数的取值及操作
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。