嵌入式Linux系统编程学习之二十四消息队列
文章目录
- 前言
- 一、msgget 函数
- 二、msgsnd 函数
- 三、msgctl 函数
- 补充
前言
消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列中读取信息。但 FIFO 需要读、写的两端事先都打开,才能够开始信息传递工作。而消息队列可以事先往队列中写信息,需要时再打开读取信息。
System V IPC 机制消息队列的函数原型为:
#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int msgflg);int msgsnd(int msgid, struct msgbuf *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msgid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);int msgctl(int msgid, int cmd, struct msqid_ds *buf);
一、msgget 函数
函数 msgget 创建和访问一个消息队列。
参数 key 是唯一标识一个消息队列的关键字,如果为 IPC_PRIVATE (值为 0 ,用于创建一个只有创建者进程才可以访问的消息队列),表示创建一个只由调用进程使用的消息队列;非 0 值的 key(可以通过 ftok 函数获得)表示创建一个可以被多个进程共享的消息队列;
参数 msgflg 指明队列的访问权限和创建标志,创建标志的可选值为 IPC_CREAT 和 IPC_EXCL ,如果单独指定 IPC_CREAT,msgget 要么返回新创建的消息队列 ID,要么返回具有相同 key 值的消息队列 ID ;如果 IPC_EXCL 和 IPC_CREAT 同时指明,则要么创建新的消息队列,要么当队列存在时,调用失败并返回 -1 。
函数成功的时候,返回一个消息队列的唯一标识符 ID(跟进程 ID 是一个类型),失败的时候,返回 -1。
二、msgsnd 函数
函数 msgsnd 和函数 msgrcy 用来将消息添加到消息队列中并从一个消息队列中获取信息。
参数 msgid 指明消息队列的 ID ,通常是 msgget 函数成功的返回值。
参数 msgbuf 是消息结构体,它的长度必须小于系统规定的上限,必须以一个长整型成员变量开始,接收函数将用这个成员变量来确定消息的类型。必须重写这个结构体,其中第一个参数不能改,其他自定义,如下:
struct msgbuf{long mtype; /*type of message*/char mtext[1]; /*message text*/};
字段 mtype 是用户自己指定的消息类型(通常是 0~5 中的任意一个数值),该结构体第 2 个成员仅仅是一种说明性的结构,实际上用户可以使用任何类型的数据,就是消息内容。
参数 msgsz 是消息体的大小,每个消息体最大不要超过 4K;
参数 msgflg 可以为 0 (通常为 0 )或 IPC_NOWAIT,如果设置 IPC_NOWAIT,则 msgsnd 和 msgrcv 都不会阻塞,此时如果队列满并调用 msgsnd 或队列空时调用 msgrcv 将返回错误;也就是说如果没有设置为 IPC_NOWAIT ,则当队列满并调用 msgsnd 或队列空时调用 msgrcv 将会阻塞,直到队列条件满足为止。
参数 msgtyp 有 3 种选项:
msgtyp == 0 接收队列中的第 1 个消息(通常为 0 )
msgtyp > 0 接收队列中的第 1 个类型等于 msgtyp 的消息
msgtyp < 0 接收其类型小于或等于 msgtyp 绝对值的第 1 个最低类型消息
三、msgctl 函数
函数 msgctl 是消息队列的控制函数,常用来删除消息队列。
参数 msgid 是由 msgget 返回的消息队列标识符。
参数 cmd 通常为 IPC_RMID ,表示删除消息队列。
参数 buf 通常为 NULL 即可。
补充
另外,可用
ipcs -q 命令查看系统的消息队列;
ipcs -m 查看系统的共享内存;
ipcs -s 查看系统的信号量集。
嵌入式Linux系统编程学习之二十四消息队列相关推荐
- 嵌入式Linux系统编程学习之二十八线程的等待退出
文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出 线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...
- 嵌入式Linux系统编程学习之二十六多线程概述
文章目录 一.多线程概述 二.线程分类 三.线程创建的Linux实现 一.多线程概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段,这就造成进程在进行切换等操作 ...
- 嵌入式Linux系统编程学习之二十九线程的互斥
文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言 在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...
- 嵌入式Linux系统编程学习之二十二内存映射
文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言 内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...
- 嵌入式Linux系统编程学习之二十五信号量
文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言 信号量与信号量集的概念如下 ...
- 嵌入式Linux系统编程学习之二十无名管道(PIPE)
管道是 Linux 进程间通信的一种方式,如命令 ps -ef | grep ntp . 无名管道的特点包括: 只能在亲缘关系进程间通信(父子或兄弟): 半双工(固定的读端和固定的写端): 它 ...
- 嵌入式Linux系统编程学习之二常用命令
嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
- 嵌入式Linux系统编程学习之二十一命名管道(FIFO)
文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言 无名管道只能在有亲缘 ...
最新文章
- php代码中怎么插入地图,php插入地图
- php图书信息浏览器,使PHP即时输出结果到浏览器
- 【渝粤教育】电大中专电商运营实操 (1)作业 题库
- ORACLE添加字段、删除字段
- 阿里实习 电面,面试
- angular将html导出为pdf,如何使用Angular进行转换:将HTML转换为PDF
- SAP License:sap培训
- ArcGIS——vs2015安装arcgis engine不兼容
- 数电课程设计数字钟c语言编程,数电数字钟设计,含源码
- 四旋翼飞行器教学笔记2 —— 飞行器de姿态读取 1
- 第18节 渗透测试流程和简单案例
- rospy.init_node(‘talker_node‘, anonymous=True)中anonymous意思
- CSS学习笔记-块状元素-行间元素
- sumif函数的使用方法
- 手机计算机的隐藏小技巧,华为手机隐藏的5个技巧,每一个值得收藏
- storm mysql trident_Apache Storm 官方文档 —— Trident 教程
- JMM 8 大原子操作
- android 实时高斯模糊 毛玻璃效果
- Oracle问题:ORA-01109解决办法
- 关于字符串比较不能用“==”,用什么?
热门文章
- python 自动收集经济数据_完结】数据分析思维案例实战92 用Python自动办公,做职场高手【更新中】91.一课经济...
- 解决Hbase报错java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for....
- storm计数器(小白看懂系列)
- 静止一秒_生命静止前的那一秒,我们并不是无能为力...
- php实现ssh客户端,php无阻塞SSH客户端实例
- 数魔选品怎么样_Sellermotor数魔跨境好不好用?怎么样?
- nodejs 遍历json数据_PostgreSQL 务实应用(四/5)JSON
- IP通信基础学习第十周
- lintcode 734. 形式为a^i b^j c^k的子序列数量 题解
- 跨域验证cookie与缓存控制