【Linux】IPC-消息队列

问题 消息队列id 和键值KEY区别?

首先要注意一个概念:IPC结构都是内核的结构。也就是说IPC结构由内核维护,对于每个进程都是公共的,不属于某个特定进程。只有这样,IPC结构才能支持它们“进程间通信”的功能。

有两个东西可以标识一个IPC结构:标识符(ID)和键(key)。

Key是IPC结构的内部名。内部即在进程内部使用,这样的标识方法是不能支持进程间通信的。

ID就是IPC结构的外部名。这些进程得到的ID其实是标识了同一个IPC结构,如消息队列同时被进程A和进程B访问。多个进程间就可以通过这个IPC结构通信。

已知一个key,当希望利用这个key创建一个新的IPC时,可以使用get函数,并在flag中指定IPC_CREAT位,例如队列的情况,就是qid = msgget(key, IPC_CREAT)

一、基本概念

  • 消息队列就是一个消息的链表。一条消息可以看作一个有结构的记录。
  • IPC方式之一(进程间通信)
  • 消息可以通过结构类型区分

1143923-20170804213141787-372320002.jpg

二、函数学习

2.1 创建消息队列

2.1.1 函数名
msgget
2.1.2 函数原型
int msgget(key_t key, int msgflg);
2.1.3 函数功能
打开或创建消息队列
2.1.4 头文件
  #include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>
2.1.5 返回值
success:the message queue identifier(消息队列ID)
error:-1

2.1.6 参数说明

key:键值
msgflg:打开标志.    IPC_CREAT:标明新创建一个消息队列。IPC_EXCL:标明打开一个消息队列

2.2 写消息

2.2.1 函数名
msgsnd
2.2.2 函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
2.2.3 功能
发送消息到消息队列
2.2.4 头文件
  #include <sys/ipc.h>#include <sys/msg.h>
2.2.5 返回值
success:0
error:-1
2.2.6 参数说明
msqid:消息队列的ID
msgp:指向要发送的消息
msgsz:消息的长度(与结构有关,不含message type)
msgflg:标志位
P.S.General Form of message
       struct msgbuf {long mtype;       /* message type, must be > 0 */char mtext[1];    /* message data */};The  mtext  field is an array (or other structure) whose size is speci-fied by msgsz, a non-negative integer value.

2.3 读消息

2.3.1 函数名
msgrcv
2.3.2 函数原型
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
2.3.3 功能
从消息队列中接收消息
2.3.4 头文件
   #include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>
2.3.5 返回值
success:实际接收消息的数据长度
error: -1
2.3.6 参数
msqid:消息队列的id
msgp :存放取出的消息
msgsz:希望取到消息的最大长度
msgtyp:消息的类型
msgtyp = 0 ,忽略类型,直接取队列中的第一条
msgtyp >0,  取 消息队列中类型等于msgtyp的第一条消息
msgtyp <0,  取 类型比msgtyp的绝对值要小或者等于的消息,如果有多条消息满足该条件,则取类型号最小的一条。
If msgtyp is less than 0, then the first message in  the  queue  withthe  lowest  type  less than or equal to the absolute value of msgtypwill be read.msgflg:标志

2.4 删除消息队列(控制)

2.4.1 函数名
msgctl
2.4.2 函数原型
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
2.4.3 函数功能
控制消息队列
2.4.4 头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
2.4.5 返回值
success:0
error :-1
2.4.6 参数说明
msqid:消息队列的id
cmd:操作命令,IPC_RMID 用于删除消息队列
buf :获取内核中的msqid_ds 结构

三、综合实例

发送
/* Send.c*/#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>struct msgbuf
{long msgtype;char msgtext[1024];
};int main()
{int msqid;int msg_type;char str[256];struct msgbuf msgs;/* 创建消息队列 */msqid = msgget(1024,IPC_CREAT);while (1){printf("Please input message type,0 for quit!\n");/* 获取消息类型 */scanf("%d",&msg_type);/* 如果用户输入的消息类型为0,退出该循环 */if (msg_type == 0)break;/* 获取消息数据 */printf("Please input message content!\n");scanf("%s",str);msgs.msgtype = msg_type;strcpy(msgs.msgtext,str);/* 发送消息 */msgsnd(msqid,&msgs,sizeof(struct msgbuf),0);}/* 删除消息队列 */msgctl(msqid,IPC_RMID,0);return 0;}
接收
/* Receive.c*/#include <stdio.h>
//#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>/* 多进程-子进程 */int msqid = 0;struct msgt
{long msgtype;char msgtext[1024];
};/* 创建子线程 */
void childprocess()
{struct msgt msgs;while(1){/* 接收消息队列 */msgrcv(msqid,&msgs,sizeof(struct msgt), 0, 0);/* 打印消息队列中的数据 */printf("message text: %s\n",msgs.msgtext);}return;
}void main()
{int i;int cpid;/* 打开消息队列 */msqid = msgget(1024, IPC_EXCL);/* 创建3个子进程 */for(i=0;i<3;i++){cpid = fork();//创建子线程???if (cpid<0)printf("Creat childprocess ERROR\n");else if(cpid == 0)childprocess();}}

转载于:https://www.cnblogs.com/Neo007/p/7287227.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux shell之得到当前路径下的目录

方法1 find . -type d 方法2 ^是开头开头得意思&#xff0c;然后d是dictionary意思 ls -al | grep ^d 方法3 ls -F | grep /$ 方法4 ls -d */

python中html.parser_在Python中使用HTMLParser解析HTML的教程

如果我们要编写一个搜索引擎&#xff0c;第一步是用爬虫把目标网站的页面抓下来&#xff0c;第二步就是解析该HTML页面&#xff0c;看看里面的内容到底是新闻、图片还是视频。假设第一步已经完成了&#xff0c;第二步应该如何解析HTML呢&#xff1f;HTML本质上是XML的子集&…

分别统计出其中英文字母、空格、数字和其它字符的个数 matlab 程序,编写一段程序,要求先输入一行字符,然后分别统计出其中英文...

编写一个求和的程序,要求能任意输入两个整数,求和 用javascript写functionadd(){varAdocument.getElementById("a").value;varBdocument.getElementById("b").value;varA用C语言编写一段程序,输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符…

【ArcGIS遇上Python】长时间序列(30年)每两组栅格数据对应做减法运算求物候参数

Python语言在ArcGIS软件中发挥着乾坤大挪移的作用,然而很多人并不知道它的厉害之处。今天我们利用Python语言来批处理遥感物候数据,获取物候期的参数。 说明: (1)Up_Path:始期数据路径变量 (2)Down_Path:末期数据路径变量 (3)outPath:相减输出结果路径变量 完…

Blazor University (14)渲染树

原文链接&#xff1a;https://blazor-university.com/components/render-trees/渲染树当浏览器呈现内容时&#xff0c;它不仅绘制 HTML 中定义的元素&#xff0c;还必须根据页面大小&#xff08;元素流&#xff09;计算绘制它们的位置。例如&#xff0c;以下 Bootstrap HTML 将…

思科加强生成树性能的属性(Portfast /Uplinkfast/BackboneFast)与RSTP的关系

思科加强生成树性能的属性&#xff08;Portfast/Uplinkfast/BackboneFast&#xff09;与RSTP的关系本文截自于博主CCNP交换技术稿件内容4.2.6思科加强生成树性能的属性&#xff08;Portfast/Uplinkfast/BackboneFast&#xff09;与RSTP的关系首先说明一下&#xff0c;为什么笔者…

数据结构(java语言描述)顺序栈的使用

&#xff11;&#xff0e;声明Istack接口&#xff1b; package stack;public interface Istack { public void clear(); public boolean isEmpty(); public int length(); public Object peek(); public void push(Object x) throws Exception; public Objec…

sql LEFT JOIN RIGHT JOIN(左连接)(mysql)

我们首先来看我们的两个表&#xff1a; table1: table2: 在这里&#xff0c;LEFT JOIN&#xff08;内连接,或等值连接&#xff09;&#xff1a;取得左表&#xff08;table1&#xff09;完全记录&#xff0c;即是右表&#xff08;table2&#xff09;并无对应匹配记录。 …

linux shell之xargs 、tr、sha1sum、head、tail一般使用

1 xargs命令 有点类似-exec命令 1&#xff09;删除当前目录下面的c文件 find . -name "*.c" | xargs rm 2&#xff09;统计当前c文件里面的代码行数 find . -name "*.c" | xargs wc -l 2 tr命令 替换命令 1&#xff09;把大小替换成小写 echo &quo…

php的_auto,AutoPHPCheck下载

AutoPHPCheck官方版是一款相当优秀的php开发人员专用PHP验证工具&#xff0c;AutoPHPCheck官方版功能全面&#xff0c;便捷好用&#xff0c;支持执行快速验证来帮助您确保代码的安全性&#xff0c;并且软件还附带了一个基本的语法检查器&#xff0c;可以查找并帮助您处理错误。…

python0表示剪刀_石头,纸,剪刀Python代码。帮助简化

我是Python新手&#xff0c;只写过几个程序。这是我最近为一个“石头剪子”游戏编写的代码。我已经测试过了&#xff0c;效果很好。有什么方法可以简化它吗&#xff1f;谢谢&#xff01;import randomwins0losses0ties0rounds0r1 #rockp2 #papers3 #scissorsy "The compu…

Google图片加载库Glide的简单封装GlideUtils

Google图片加载库Glide的简单封装GlideUtils

【ArcGIS遇上Python】Python实现点转栅格(PointToRaster)

在ArcGIS中提供了点转栅格(PointToRaster)的工具,如下所示: 参数说明: (1)file:点图层(.shp) (2)data:值字段 (3)outFile:转换后的栅格图层 (4)9660.848118:空间分辨率 python批处理代码: import arcpy arcpy.gp.overwriteOutput=1 arcpy.env.workspace=&…

ASP.NET Core认证授权方案

前言在前面我讲过基于token的权限认证&#xff0c;然后前几天有小伙伴私信我&#xff0c;怎么做一个身份认证也就是授权。在Asp.net Core常见的授权方式有:基于角色的授权&#xff0c;有基于声明的授权&#xff0c;有基于策略的授权&#xff0c; 这三种授权我就不做过多介绍了,…

linux基础知识个人总结

linux基础知识个人总结第一章&#xff1a;1. Linux发展史略&#xff0c;有代表性的Linux发行版&#xff1a;Suse、slackware、ubuntu、RedHat、CentOS2. GNU是Richard Stallman在1983年发起的一项自由软件运动&#xff0c;目标是为了创建一套完全自由的操作系统&#xff0c;它要…

linux shell之pushd、popd、dirs

1 问题 我们有时候需要保存多个路径&#xff0c;上下键切换不方便&#xff0c;用cd-只能到上个目录&#xff0c;我们可以用dirs和pushd和popd 2 dirs、pushd、popd dirs: 这个命令显示栈里面所有的路径&#xff0c;一定会包含当前路径,常用参数如下 dirs -v 显示栈里面的所有…

插入排序—直接插入排序(Straight Insertion Sort)

基本思想: 将一个记录插入到已排序好的有序表中&#xff0c;从而得到一个新&#xff0c;记录数增1的有序表。即&#xff1a;先将序列的第1个记录看成是一个有序的子序列&#xff0c;然后从第2个记录逐个进行插插入到已入&#xff0c;直至整个序列有序为止。 要点&#xff1a;设…

SQL UNION 和 UNION ALL 操作符(mysql)

首先看两个表&#xff1a; table1: table2: 如果我们要查询table1表和 table2表中的 name1的值&#xff0c;但是不存在重复的值一起输出出来&#xff0c;那么就可以用union操作符&#xff1a; SELECT name1 FROM table1 UNION SELECT name1 FROM table2 结果我们会查…

redis php方案,Redis三种部署方案图文详解

standaloan(单机模式)standaloan 是redis单机模式&#xff0c;及所有服务连接一台redis服务&#xff0c;该模式不适用生产。如果发生宕机&#xff0c;内存爆炸&#xff0c;就可能导致所有连接改redis的服务发生缓存失效引起雪崩。(推荐&#xff1a;redis视频教程)ssentinel(哨兵…

【ArcGIS遇上Python】Python版的ArcGIS栅格计算器模板

python编写的栅格计算器&#xff0c;用于批处理。 import arcpy from arcpy.sa import * arcpy.CheckOutExtension("spatial") arcpy.gp.overwriteOutput1#custom arcpy.env.workspace"G:\\Phenology of 30 Years\\GIMMS 3g\\15Length\\1Length\\" #custo…