文章目录

  • 前言
  • 一、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系统编程学习之二十四消息队列相关推荐

  1. 嵌入式Linux系统编程学习之二十八线程的等待退出

    文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出   线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...

  2. 嵌入式Linux系统编程学习之二十六多线程概述

    文章目录 一.多线程概述 二.线程分类 三.线程创建的Linux实现 一.多线程概述   进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段,这就造成进程在进行切换等操作 ...

  3. 嵌入式Linux系统编程学习之二十九线程的互斥

    文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言   在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...

  4. 嵌入式Linux系统编程学习之二十二内存映射

    文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言   内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...

  5. 嵌入式Linux系统编程学习之二十五信号量

    文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言   信号量与信号量集的概念如下 ...

  6. 嵌入式Linux系统编程学习之二十无名管道(PIPE)

      管道是 Linux 进程间通信的一种方式,如命令 ps -ef | grep ntp .   无名管道的特点包括: 只能在亲缘关系进程间通信(父子或兄弟): 半双工(固定的读端和固定的写端): 它 ...

  7. 嵌入式Linux系统编程学习之二常用命令

    嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...

  8. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

  9. 嵌入式Linux系统编程学习之二十一命名管道(FIFO)

    文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言   无名管道只能在有亲缘 ...

最新文章

  1. php代码中怎么插入地图,php插入地图
  2. php图书信息浏览器,使PHP即时输出结果到浏览器
  3. 【渝粤教育】电大中专电商运营实操 (1)作业 题库
  4. ORACLE添加字段、删除字段
  5. 阿里实习 电面,面试
  6. angular将html导出为pdf,如何使用Angular进行转换:将HTML转换为PDF
  7. SAP License:sap培训
  8. ArcGIS——vs2015安装arcgis engine不兼容
  9. 数电课程设计数字钟c语言编程,数电数字钟设计,含源码
  10. 四旋翼飞行器教学笔记2 —— 飞行器de姿态读取 1
  11. 第18节 渗透测试流程和简单案例
  12. rospy.init_node(‘talker_node‘, anonymous=True)中anonymous意思
  13. CSS学习笔记-块状元素-行间元素
  14. sumif函数的使用方法
  15. 手机计算机的隐藏小技巧,华为手机隐藏的5个技巧,每一个值得收藏
  16. storm mysql trident_Apache Storm 官方文档 —— Trident 教程
  17. JMM 8 大原子操作
  18. android 实时高斯模糊 毛玻璃效果
  19. Oracle问题:ORA-01109解决办法
  20. 关于字符串比较不能用“==”,用什么?

热门文章

  1. python 自动收集经济数据_完结】数据分析思维案例实战92 用Python自动办公,做职场高手【更新中】91.一课经济...
  2. 解决Hbase报错java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for....
  3. storm计数器(小白看懂系列)
  4. 静止一秒_生命静止前的那一秒,我们并不是无能为力...
  5. php实现ssh客户端,php无阻塞SSH客户端实例
  6. 数魔选品怎么样_Sellermotor数魔跨境好不好用?怎么样?
  7. nodejs 遍历json数据_PostgreSQL 务实应用(四/5)JSON
  8. IP通信基础学习第十周
  9. lintcode 734. 形式为a^i b^j c^k的子序列数量 题解
  10. 跨域验证cookie与缓存控制