首页 理论教育 嵌入式Linux编程实例-消息队列

嵌入式Linux编程实例-消息队列

时间:2023-10-31 理论教育 版权反馈
【摘要】:消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。操作消息队列时用到的数据结构主要有msgbuf、msqid_ds和ipc_perm。与消息队列处理相关的函数主要有以下几种。参数flags用来决定消息队列的存储权限。新的消息总是放在队列的尾部。当函数成功返回后,会更新相应队列的msqid_ds结构。

嵌入式Linux编程实例-消息队列

消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。消息队列是存放在内核中的,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正删除。操作消息队列时用到的数据结构主要有msgbuf、msqid_ds和ipc_perm。

msgbuf的定义如下。

978-7-111-33316-6-Chapter09-61.jpg

978-7-111-33316-6-Chapter09-62.jpg

在结构中共有两个元素:mtype指消息的类型,由一个整数代表,并且它只能是整数。mtext是消息数据本身。

msqid_ds的定义如下。

978-7-111-33316-6-Chapter09-63.jpg

各字段的含义如下。

●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的定义如下。

978-7-111-33316-6-Chapter09-64.jpg

978-7-111-33316-6-Chapter09-65.jpg

与消息队列处理相关的函数主要有以下几种。

1.msgget()(www.xing528.com)

msgget()函数原型为

978-7-111-33316-6-Chapter09-66.jpg

该函数中的参数key用来转换成一个标识符。每一个IPC对象与一个key对应。参数flags用来决定消息队列的存储权限。

2.msgrcv()

函数msgrcv()可以从队列中读取消息。该函数原型为

978-7-111-33316-6-Chapter09-67.jpg

其中参数msqid为指定要读的队列;参数ptr为要接收数据的缓冲区;nbytes为要接收数据的长度,当队列中满足条件的消息长度大于nbytes的值时,则会参照行为参数flag的值决定如何操作:当flag中设置了MSG_NOERROR位时,则将消息截短到nbytes指定的长度后返回。如没有MSG_NOERROR位,则函数返回出错,并设置错误变量errno。设置type参数可指定msgrcv()函数所要读取的消息。tyre的取值及相应操作见表9-5。

表9-5 type的取值及相应操作

978-7-111-33316-6-Chapter09-68.jpg

参数flag用于定义函数的行为,如设置了IPC_NOWAIT位,则当队列中无符合条件的消息时,函数出错返回,errno的值为ENOMSG。如没有设置IPC_NOWAIT位,则进程阻塞,直到出现满足条件的消息为止,然后函数读取消息返回。

3.msgsnd()

由于消息队列的特殊性,系统为这个数据类型提供了两个接口(msgsnd()函数,msgrcv()函数),分别对应写消息队列及读消息队列。

函数msgsnd()的作用是写消息队列。该函数原型为:

978-7-111-33316-6-Chapter09-69.jpg

对于写入队列的每一条消息都含有3个值:正长整型的类型字段、数据长度字段和实际数据字节。新的消息总是放在队列的尾部。函数中的参数msqid指定要操作的队列,ptr指针指向一个msgbuf的结构,这是一个模板的消息结构。

函数中的参数nbytes指定了消息的长度,参数flags指明函数的行为。若函数成功,则返回0,否则返回-1,并设置错误变量errno。errno可能出现的值有EAGAIN、EACCES、EFAULT、EIDRM、EINTR、EINVAL和ENOMEM。当函数成功返回后,会更新相应队列的msqid_ds结构。

4.msgct1()

函数msgctl()可以在队列上做多种操作。该函数原型为:

978-7-111-33316-6-Chapter09-70.jpg

参数msqid为指定的要操作的队列。参数cmd指定所要进行的操作,其中有些操作需要buf参数。cmd参数的取值及操作见表9-6。

表9-6 cmd参数的取值及操作

978-7-111-33316-6-Chapter09-71.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈