Linux实验---- 基于消息队列和共享内存的进程间通信 实验五

八.linux的进程间通信之管道、消息队列、共享内存简介 http://note.youdao.com/noteshare?id=e776f7ddbdee26e3d3a3f102b27174be&sub=725B6C7D7A074448AE46FDEF0B8682D5 目录 一、linux的进程间通信简介 1、进程间通信简介 2、多进程编程的优缺点 1、优点 2、缺点 二、linux的IPC机制1-管道 1、管道(无名管道) 2... 阅读详情

一 实验题目:基于消息队列和共享内存的进程间通信

二 实验目的

Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:
Linux支持的消息通信机制及其使用方法
Linux系统的共享存储区的原理及使用方法。

三 实验内容

1) 消息的创建、发送和接收

使用消息调用msgget()、msgsnd()、msggrev()、msgctrl()编制长度为1K的消息的发送和接收程序。

2) 共享存储取得创建、附接和断接

使用系统调用shmget()、shmat()、shmctl()、shmctl(),编制一个与上述功能相同的程序。

四 实验步骤

为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,server和client,进行通信;server端建立一个key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息时,则作为结束信号,取消该队列,并退出Server。Server每收到一个消息后显示一句“(Server)received;Client端使用key为75的消息队列,先后发送类型为10到1的消息,然后退出。最后一个消息即server端需要的结束信号。Client每发送一条消息,显示一句“(Client)sent”;父进程在server和client均退出后结束。

1、共享内存

(1)共享存储区的建立。

   int shmget (key_t key ,size_t size ,int shmflag);
   //具体使用:
   shmid=shmget(key,size,IPC_CREAT);
   //shmid是共享内存ID
   //IPC键值key是fork()函数获取的;

建立(获得)一块共享存储区,返回该共享存储区的描述符shmid;若尚未建立,便为进程建立一个指定大小的共享存储区。

(2)共享存储区的控制

  int shmctl(int shmid,int cmd,struct shmid_ds *buf) ;
  //shmid   id号
  //cmd  功能控制:IPC_RMID 删除 只列举一个 其余自查
  //*buf 是shmid_ds数据类型的地址用来存放或更改消息队列的属性

对共享存储区的状态信息进行查询,如其长度、所连接的进程数、创建者标识符等;也可设置或修改其属性,如共享存储区的许可权、当前连接的进程计数等;还可用来对共享存储区加锁或解锁,以及修改共享存储区标识等。

(3) 共享存储区的附接

在进程已经建立了共享存储区或已获得了其描述符后,还须利用系统调用

void *shmat(int shmid,const void *shmaddr ,int shmflag);
//shmaddr:一般用0让系统自动识别
//shmflag:0 可读可写
//        SHM_RND 
这个函数使用:
char *shmadd;
shmadd=shmat(shmid ,NULL,0);

将该共享存储区附接到用户给定的某个进程的虚地址上,并指定该存储区的访问属性,即指明该区是只读,还是可读可写。此共享存储区便成为该进程虚地址空间的一部分。

(4)共享存储区的断开

当进程不再需要该共享存储区时,再利用系统调用

int  shmdt(const void *shmaddr);

把该区与进程断开。 但不删共享内存

2、消息队列

(1)创建消息队列msgget()

 msgqid = msgget(key,size,flag)  

功能:获得一个消息的描述符,该描述符指定一个消息队列以便用于其他系统调用。
该函数使用头文件如下:

#include < sys/ types.h>
#include <sys/ ipc.h>
#include < sys/ msg.h>

(2)发送一条消息msgsnd()

msgsnd(id,msgp,size,flag) 

功能:发送一条消息。
其中:
id 是返回消息队列的描述符;
msgp 是指向用户存储区的一个构造体指针
size 指示由msgp 指向的数据结构中字符数组的长度; 即消息的长度。
flag 规定当核心用尽内部缓冲空间适应执行的动作;
(若在标志flag 中未设置IPC_NOWAIT位,则当该消息队列中的字节数超过一最大值时,或系统范围的消息数超过某一最大值时,调用msgsnd 进程睡眠。若是设置IPC_NOWAIT,则在此情况下,msgsnd 立即返回。)

(3)接收消息msgrcv()

msgrcv(id,msgp,size,type,flag)

功能:接受一条消息。
其中:
id 是消息描述符,
msgp 是用来存放欲接受消息的用户数据结构的地址;
size 是msgp中数据数组的大小;
type 是用户要读的消息类型:
• type为0 :接收该队列的第一个消息;
• type 为正: 接收类型type 的第一个消息;
• type 为负: 接收小于或等于type 绝对值的最低类型的第一个消息
flag 规定倘若该队列无消息,核心应当做什么事,如果此时设IPC_NOWAIT标志,则立即返回,若在flag 中设置了MSG_NOERROR,且所接收的消息大小大于size ,核心截断所接收的消息。

(4)消息队列的控制msgctl()

msgctl(id,cmd,buf) ;

功能:查询一个消息描述符的状态,设置它的状态及删除一个消息描述符。

int id,cmd;
struct msqid_ds * buf;

其中:
函数调用成功是返回0,调用不成功时返回-1 。
• id 用来识别该消息的描述符; cmd 规定命令的类型。
• IPC_STAT 将与id 相关联的消息队列首标读入buf
• IPC_SET 为这个消息序列设置有效的用户和小组标识及操作允许权和字节的数量。
• IPC_RMID删除id 的消息队列

五实验结果

消息队列

msg_write.c在这里插入图片描述
msg_read.c在这里插入图片描述

共享内存

shm_read.c
在这里插入图片描述
shm_write.c
在这里插入图片描述

六总结

1必须掌握进程的创建,会创建两个子进程;
2要了解消息队列的创建机制,先定义key值,通过ftok获取键值,本实验直接给出了key,然后创建消息队列,发送接收消息等一些列操作;
3同样要知道共享内存的工作机制,创建一块共享内存区,用shmat函数将共享内存段映射到调用进程的数据段中,想共享内存里写入读出数据;
4要有明确的逻辑思路,先创建两个进程,分别在进程中进行操作;

总结为本人做实验时随便写的,基本的废话而已,海涵!

进程间共享存储区通信机制的使用 进程间共享存储区通信机制的使用 使用共享内存机制实现一定长度的消息的发送和接收。 立即下载

相关推荐

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5335

2021-10-25 操作系统实验2——消息队列实验

文章目录一、实验目的二、实验任务三、实验要求四、实验过程五、思考 一、实验目的 了解和熟悉linux支持的消息通信机制。 二、实验任务 使用linux系统提供的系统调用msgget(),msgrev(),msgctl()编制一个长度为1K的消息发送和接受的程序。 三、实验要求 用一个程序作为“引子”,先后fork()两个进程,SERVER和CLIENT,进行通信。 由SERVER端创建一个Key为75的消息队列,等待CLIENT端进程发来的消息。当遇到类型为1的消息,则作为结束信号,删除该队列,并退出SE

zheliku的博客 3516

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

前言 之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。 DMA 能大大减轻CPU负荷的东西,建议场景合适的情况下,都去用DMA功能。 USART 一种串行通信协议, ...

欢喜6666的博客 3万+

Linux编程基础 5.2:消息队列

内容后面来补充

爱学习爱运动的专栏 2893

通达信源码-主力建仓-AI投研图灵室出品

AI投研图灵室1:=3*SMA((CLOSE-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1)-2*SMA(SMA((CLOSE-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1),15,1);AI投研图灵室2W:=100-100*(HHV(HIGH,14)-CLOSE)/(HHV(HIGH,14)-LLV(LOW,14));AI投研图灵室3:=SMA(SMA(AI投研图灵室2,3,1),3,1);

qq_57222058的博客 4370

水下机器人仿真平台选型指南:从AirSim到Unity3D的深度对比

本文深入对比了AirSim+UE和Unity3D两大水下机器人仿真平台的核心架构、传感器仿真能力和水下环境建模特点。AirSim+UE凭借高精度物理仿真和丰富传感器支持成为专业研发首选,而Unity3D则以快速开发和灵活扩展见长。文章为研发团队提供了全面的选型指南,帮助优化水下实验的仿真效率与成本。

weixin_29009669的博客 449

操作系统实验:进程间通信

一.实验目的: Linux的进程通信机构(IPC)允许在任意进程之间大量的交换数据。本实验的目的是了解和熟悉Linux支持的消息通信机制、共享存储区机制及信息量机制。 二.实验要求: 阅读Linux系统的msg.c,sem.c和shm.c等源码文件,熟悉Linux中的三种通信机制。 三. 实验内容: 消息的创建、发送和接受。(1)使用系统调用msgget( ),msgsnd( ),msgrev( )及msgctl()编制一长度为1K的消息的发送和接收程序。(2)观...

qq_50542009的博客 3890

Java开发者的福音:Aspose 25.10全系列(Cells/Words/PDF/Slides)最新版破解与集成保姆级教程

本文为Java开发者提供了Aspose 25.10全系列组件(Cells/Words/PDF/Slides)的最新版破解与集成保姆级教程。通过详细的Maven依赖配置、字节码修改技术绕过限制,以及Spring Boot项目中的实战集成指南,帮助开发者高效实现Office文档处理功能,提升开发效率。

weixin_30919429的博客 344

操作系统——Linux 进程间通信

操作系统课设:实验三

CSH__的博客 1227

搭建AutoSAR开发环境

任何开发都需要一套开发环境,包括软硬件环境,笔者后续将介绍的是 NXP 的 S32K144 配套的开发板。接下来详细介绍怎么获取这些软硬件工具。仅供个人学习使用!

cfl927096306的博客 6102

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

weixin_42412049的博客 2296

linux下消息队列

#include <stdlib.h> #includ...

weixin_34233679的博客 194

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于消息队列和共享内存的进程间通信

引入 掌握基于消息队列和共享内存的进程间通信原理 实验项目 基于消息队列和共享内存的进程间通信 实验目的 1.加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。 2.掌握进程管理、进程通信。 3.Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。 4.本实验的目的是了解和熟悉: 5.Linux支持的消息通信机制及其使用方法 6.Linux系统的共享存储区的...

qq_43711326的博客 2667

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Linux】进程间通信——system V(共享内存 | 消息队列 | 信号量)

同一主机内的进程间通信方案,在OS层面专门为进程间通信设计的方案让不同的进程看到同一份资源system V标准下的三种通信方式共享内存消息队列信号量我们来看看 system V标准下的三种通信方式。⭐主体学习【Linux学习】进程间通信——system V(共享内存 | 消息队列 | 信号量)咱们按照下面的图解:​。

AAlykk的博客 1398

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux实验五:进程间通信(一)

Linux程序设计实验五:进程间通信(一)。

Morse_Chen的博客 2777

Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)

1.System V共享内存 1.1相关函数介绍 写个小项目 项目规划 Cnmm.hpp ShmClient.cpp PipeServe.cpp 1.2指令查看与删除 2.System V消息队列 消息队列的原理 相关函数 3.System V 信号量 3.1概念 3.2周边知识 4.内核中

qq_74415153的博客 1996

【Linux】进程间通信(三)——共享内存和消息队列

本文介绍了两种进程间通信机制:共享内存和消息队列。共享内存通过直接访问同一物理内存实现高效数据交换,需配合信号量进行同步,包含创建(shmget)、映射(shmat)、操作(p/v)和删除(shmctl)等步骤,具有高性能但需手动管理同步。消息队列采用异步通信模式,通过msgget创建、msgsnd/msgrcv收发消息、msgctl删除,支持解耦和流量削峰,但存在系统复杂度增加和消息延迟等问题。两种方式各适用于不同场景,共享内存适合高频数据交换,消息队列更适用于分布式系统和解耦需求。文中通过C语言代码示例

2302_76793428的博客 967

IPC之消息队列与共享内存

•共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。•其他进程可以把同一段共享内存段连接到它们自己的地址空间里去。•所有进程都可以访问共享内存地址,就好像它们是有malloc分配的一样•如果一个进程向这段共享内存写了数据,所做的改动会立刻被有权访问同一段共享内存的其他进程看到共享内存函数:shmget函数:函数原型:int shmget(key_t key,size_t size, int shmflg);作用:用来创建共享内存•。

weixin_62603444的博客 1711

Linux 进程间通信(共享内存+消息队列)

进程间通信、共享内存、消息队列,底层原理和接口详解 ...

2201_75663820的博客 1519

【Linux学习】进程间通信——system V(共享内存 | 消息队列 | 信号量)

详细介绍了共享内存的通信方式,包括它的原理和实现,以及涉及到的细节。大致描述了消息队列和信号量的一些概念。

weixin_63726869的博客 2553

【linux系统编程】进程间通信——共享内存+消息队列+信号量

这是进程间通信的第二方式,System V标准的进程间通信,包括共享内存,消息队列,信号量。本文详细讲解了三种方式的原理,接口的介绍,以及共享内存的实现,共享内存的特点,关键在于如何理解key,用来表示共享内存,消息队列,以及消息量在内核中的唯一性等等!

fight_p的博客 1449

Linux进程间通信——管道,共享内存,消息队列,信号量

本文讲述了几种进程间通信的方式,包括具有亲缘关系进程使用的匿名管道,命名管道。systemV中共享内存,消息队列,还浅浅介绍了信号量概念,还有IPC资源之间的关系

欢迎来到梨+萍的博客,不准备看点啥学习嘛。。。 1130

【Linux】进程通信——共享内存+消息队列+信号量

【Linux】进程通信——共享内存+消息队列+信号量

cefler的博客 2060

Linux | 进程间通信:管道、消息队列、共享内存与信号量

数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件,例如进程终止时要通知父进程。进程控制:有些进程希望完全控制另一个进程的执行,如调试进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。管道是从一个进程连接到另一个进程的一个数据流。在 Unix 系统中,管道的使用和文件一致,迎合了“Linux 一切皆文件思想”。共享内存区是最快的 IPC 形式。

TTKunn的博客 2203
上一篇: 五分钟搞懂C++结构体、联合体、枚举的用法和区别
下一篇: Linux实验----TCP程序与UDP程序 实验六
Execution_
博客等级 码龄5年 1605粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值