| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux进程间通信(四)使用消息队列 -> 正文阅读 |
|
[系统运维]Linux进程间通信(四)使用消息队列 |
一、概述????????消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 ?每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。 二、函数讲解1、ftok函数????????该函数将文件路径和文件描述符转换为一个键值key(也可以自己定义一个键值,只要和其他不冲突就好)。
?????????fname:必须是一个已经存在且程序可范围的文件。 ?????????id:id是子序号。虽然是int类型,但是只使用8bits(1-255)。 ????????返回值:返回一个key(键值)。 2、msgget函数????????该函数用来创建和访问一个消息队列,它的原型为:
????????key:函数ftok的返回值或IPC_PRIVATE。 ????????msgflag: IPC_CREAT:创建新的消息队列。 ????????返回值:调用成功返回队列标识符,否则返回-1. 3、msgsnd函数:????????该函数用于发送消息到消息队列中,它的原型为:
????????msqid:消息队列的识别码。 ????????msg_ptr:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
????????msg_sz:消息的大小。 ????????msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。如果进程在阻塞等待过程中收到了系统的中断信号,EINTR 就会被返回。MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。当消息从队列内取出后,相应的消息就从队列中删除了。 4、msgrcv函数????????该函数用于从消息队列中获取消息,它的原型为:
????????msqid:消息队列的识别码。 ????????msg_ptr:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
????????msg_sz:消息的大小。 ????????msgtype:消息类型,msgtype等于0 则返回队列的最早的一个消息;msgtype大于0,则返回其类型为msgtype的第一个消息;msgtype小于0,则返回其类型小于或等于msgtype参数的绝对值的最小的一个消息。 ????????msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。如果进程在阻塞等待过程中收到了系统的中断信号,EINTR 就会被返回。MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。当消息从队列内取出后,相应的消息就从队列中删除了。 5、msgctl函数????????该函数用来控制消息队列,它与共享内存的shmctl函数相似,它的原型为:
????????cmd:是将要采取的动作,它可以取3个值: ????????IPC_STAT:把msgid_ds结构中的数据设置为消息队列的当前关联值,即用消息队列的当前关联值覆盖msgid_ds的值。 ????????IPC_SET:如果进程有足够的权限,就把消息列队的当前关联值设置为msgid_ds结构中给出的值。 ????????IPC_RMID:删除消息队列。 ????????buf:指向msgid_ds结构的指针,它指向消息队列模式和访问权限的结构。msgid_ds结构至少包括以下成员:
????????返回值:成功时返回0,失败时返回-1。 三、使用消息队列进行进程间通信?????????1、接收信息的程序源文件为msgrecv.c的源代码为:
????????2、发送信息的程序的源文件msgsend.c的源代码为:
四、编译结果????????编译结果如下图 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 6:29:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |