SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口。SystemV方案包含三种:共享内存、消息队列、信号量。

和System V 共享内存一样,OS为了管理这些消息队列,给每个消息队列配上了标识唯一性的编号msgid。消息队列中的消息则是以链表的形式被管理的。


        目录

1、ftok

2、msgget

3、msgsnd

4、msgrcv

5、msgctl


1、ftok

System V共享内存里也用到了这个函数,该函数的作用是生成一个具有唯一性的ID。这里的ID不是消息队列的ID,因为消息队列是一份临界资源,为了避免该消息队列被无关线程访问,所以设置了房间密码,ftok的返回值则是 “ 房间密码 ”。

ftok函数的第一个参数:路径名

ftok函数的第二个参数:项目ID

返回值:成功返回具有唯一性的“房间密码”;失败返回 -1

关于这个函数无需想的太复杂,简单来说就是,从路径名中取出一部分,然后再从ID中取出一部分,最后再把两部分组合一下形成一个整数,我们就把这个整数当作“房间密码”

注意:ftok被不同进程调用,只要路径名和ID是一样的,生成的整数就是一样的

2、msgget

msgget函数的作用是通过上面的得到的房间密码创建一个消息队列 或者 拿到已有消息队列的ID。

第一个参数 key:“房间密码”

第二个参数 msgflag:创建消息队列的方式,同时设置权限

返回值:成功返回消息队列id,失败返回 -1

类似于write函数的第二个参数,属于位运算输入

IPC_CREAT:可以单独使用,如果共享内存不存在,则重新开辟,函数返回值是新开辟的共享内

存的ID;如果已经存在,则沿用已有的共享内存,函数返回值是已有的共享内存的

ID

IPC_EXCL:无法单独使用,要配合IPC_CREAT使用,即 IPC_CREAT | IPC_EXCL

IPC_CREAT | IPC_EXCL:如果共享内存不存在,则重新开辟,函数返回值是新开辟的共享内

存的ID;如果已经存在,则报错

IPC_CREAT | IPC_EXCL | 0664:开辟共享内存的同时,设置共享内存的访问权限

key_t key = ftok(".", 100);// 如果消息队列不存在 (0664 —— rw-rw-r--)
int msghid = msgget(key, IPC_CREAT | IPC_EXCL | 0664);
// 如果消息队列已存在
int msghid = msgget(key, IPC_CREAT);

可以在命令行输入 ipcs 来判断消息队列是否创建成功。

3、msgsnd

msgsnd函数的作用是向消息队列中添加一条消息。

第一个参数 msgid:消息队列ID,即msgget函数的返回值

第二个参数 msgp: 消息缓冲区的地址,也就是你要向消息队列中添加的消息,需要满足一定的格式。消息格式如下:

struct msgbuf {long mtype;       // 消息类型,在从消息队列取出消息的时候,可以根据消息类型来选择性地取消息   char mtext[1];    // 消息内容//(结构体的最后一个成员是数组,该数组也被称为柔性数组,即数组大小可变)
};

第三个参数 msgsz:表示消息长度。这里的消息长度指的是上面这个结构体中buf成员所占字节数

第四个参数 msgflag:表示发送消息的方式。可选值如下:

可选值 含义
0 当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列
IPC_NOWAIT

当消息队列已满的时候,msgsnd函数不等待立即返回,此时是以报错的形式返回。

返回值:成功返回0,失败返回-1

4、msgrcv

msgrcv函数的作用是从消息队列的队头取出一条消息。

第一个参数 msgid:消息队列id

第二个参数 msgp:输出型参数,表示消息缓冲区的地址。也就是你要把取出来的消息放在哪,同样需要使用指定格式。(数据格式详见msgsnd函数)

第三个参数 size:用于存放接收到的消息数据的缓冲区大小。

第四个参数 msgtype:选择想要取出的消息类型(虽然叫做消息队列,但是不一定就是取出队头元素,也可以是取出具有相同消息类型中的第一个消息)。主要分为以下三种情况:

msgtype的值 解析
msgtype = 0 直接取出队头消息,不论是什么类型
msgtype > 0 从所有消息类型为msgtype的消息中,取出其中的第一条消息
msgtype < 0 接收类型小于等于 msgtype的绝对值的第一条消息。

补充:针对msgtype < 0做一些补充,假设消息队列里的消息类型有 1、3、4、5 四种类型的消息,如果msgtype = -4,绝对值是4,那就需要取出消息类型小于等于4的所有消息,因此,取出消息的消息类型必须是1、3、4类型。

第五个参数 msgflag:表示接收消息的方式。可选值如下:

可选值 含义
0 阻塞式接收消息
IPC_NOWAIT 如果消息队列中没有消息,则立马返回,此时错误码为ENOMSG
MSG_EXCEPT 与msgtype配合使用,返回队列中第一个类型不为msgtype的消息

5、msgctl

msgctl 函数的作用是控制消息队列,可以用来销毁消息队列。

第一个参数msgid:消息队列id

第二个参数cmd:对消息队列执行的具体操作,如拷贝、查询、销毁等。可选值如下:

可选值 含义
IPC_STAT 将消息队列的相关信息拷贝放到第三个参数 buf 中
IPC_RMID 销毁消息队列

第三个参数 buf:消息队列缓冲区。比如 cmd 为IPC_STAT时,会把消息队列的相关信息拷贝到该缓冲区中。

System V 消息队列(一)—— 消息队列相关接口函数(msgget / msgctl)相关推荐

  1. 线程及其相关接口函数(Linux)

    目录 一.线程 1.线程相关接口函数 (1)创建线程 pthread_create() (2)结束线程 pthread_exit() (3)等待进程 pthread_join() 2.线程间通信 (1 ...

  2. libcurl入门之相关接口函数curl_easy_setopt

    名称 curl_easy_setopt 原型 #include <curl/curl.h> CURLcode curl_easy_setopt(CURL *handle, CURLopti ...

  3. libcurl入门之相关接口函数curl_easy_cleanup

    名称 curl_easy_cleanup 原型 #include <curl/curl.h> void curl_easy_cleanup(CURL *handle); 描述 这个函数必须 ...

  4. libcurl入门之相关接口函数curl_global_init/cleanup

    名称:curl_global_init 原型 #include <curl/curl.h> CURLcode curl_global_init(long flags); 描述 这个函数设置 ...

  5. 【Linux篇】第十二篇——进程间通信(管道+system V共享内存)

    进程间通信介绍 概念 目的 本质 分类 管道 什么是管道 匿名管道 匿名管道的原理 pipe函数 匿名管道使用步骤 管道读写规则 管道的特点 管道的大小 命名管道 命名管道的原理 使用命令创建命名管道 ...

  6. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

  7. System V 消息队列概念以及相关函数(msgget、msgsnd、msgrcv、msgctl)介绍

    System V 消息队列 消息队列是半双工的通信方式 1.1 创建一个消息队列 消息队列的特点:消息只能一条的读取,不能多读取,也不能少读取,每条消息有一个类型,可以按照消息的类型读取 创建或者打开 ...

  8. 细说linux IPC(十):system V 消息队列

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] system V消息队列和posix消息队列类 ...

  9. System V IPC POSIX IPC(一):消息队列

    System V IPC & POSIX IPC(一):消息队列 消息队列允许进程之间以消息的形式交换数据,是一种常见的进程之间的通信机制. 1. 消息队列的创建 System V IPC: ...

最新文章

  1. 应用软件(E-MAIL-FTP-WEB)
  2. VTK修炼之道16:图像处理_窗口分割和图像融合(ViewportvtkImageBlend)
  3. C# WinForm窗体界面设置
  4. a标签传值到另一个页面_前端开发入门——HTML基础标签
  5. 余数运算符在Java中用于Doubles
  6. freecplus框架-tcp网络通信
  7. java易忘代码备份
  8. grafana和zabbix的端口映射
  9. JavaScript通过style只能获取内联 状态的样式
  10. silverlight:分享一个不错的自定义布局CollectionFlow(可用于制作相册的哦!)
  11. Java异常处理-----finally
  12. k8s1.18-kubeadm安装手册
  13. 小觅深度相机标准版 ROS使用
  14. 80004005错误代码_0x80004005,详细教您解决0x80004005错误代码的方法
  15. 神奇的零知识证明,既能保守秘密,又能让别人信你!
  16. 基于微信小程序的毕业设计题目(35)PHP医院预约挂号小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
  17. python的dict
  18. poj计算几何题推荐
  19. 解决win7防火墙打不开的问题:错误代码1079和错误代码13
  20. Android AOSP 源码 编译 android5.1.1,并刷入手机

热门文章

  1. 两位数四则混合运算考试题
  2. DDR3 AXI4 IP核读写仿真实验(2)
  3. FFmpeg怎么区分识别视频是逐行扫描还是隔行扫描
  4. Dynamic ReLU 解读
  5. web前端开发需要学习什么?
  6. 计算机毕设Python+Vue综合众筹网站(程序+LW+部署)
  7. Adams定义空气阻力
  8. 卷积神经网络特征图可视化热图可视化
  9. Redis 有序集合为什么叫zset?zset英文全称是什么?
  10. Java集合——List接口学习总结