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

news2024/11/8 21:43:21

一:实验题目

Linux 进程间通信

二:实验目的

Linux 系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据,通过本实验,理解

熟悉 Linux 支持的消息通信机制。

三:实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键代码)

实验原理:主要用到4个函数

int msgget(key_t key, int msgflag);

key:某个消息队列的名字,用frok()产生 (函数frok的返回值)或IPC_PRIVATE,获取消息队列的标识符,创建和访问一个消息队列。

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msqid:消息队列标识符,由msgget获得;

cmd:控制标识符,IPC_SET 命令:设置属主的用户标识符和组标识符,IPC_STAT 和 IPC_INFO 命令:获得资源状态信息,IPC_RMID 命令:释放这个资源;

buf:消息队列管理结构体,请参见消息队列内核结构说明部分。

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

msqid:消息队列标识符;

msgp:发送给队列的消息。msgp可以是任何类型的结构体,但第一个字段必须为long类型,即表明此发送消息的类型,msgrcv根据此接收消息。msgp定义的参照格式如下:

    struct s_msg{ /*msgp定义的参照格式*/

     long type; /* 必须大于0,消息类型 */

           char mtext[256]; /*消息正文,可以是其他任何类型*/

    } msgp;

msgsz:要发送消息的大小,不含消息类型占用的4个字节,即mtext的长度;

msgflg:控制位,规定当核心用尽内部缓冲空间时应执行的动作

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

msqid:消息队列标识符;

msgp:存放消息的结构体,结构体类型要与msgsnd函数发送的类型相同;

msgsz:要接收消息的大小,不含消息类型占用的4个字节;

msgtyp:0:接收第一个消息;>0:接收类型等于msgtyp的第一个消息;<0:接收类型等于或者小于msgtyp绝对值的第一个消息;

msgflg:规定倘若该队列无消息,核心应当做什么事,如果此时设置了 IPC_NOWAIT 标志,则立即返回,若在 flag 中设置了 MSG_NOERROR,且所接收的消息大小大于 size ,核心截断所接收的消息。

msgrcv()解除阻塞的条件有以下三个:

1.消息队列中有了满足条件的消息。

2.msqid代表的消息队列被删除。

3.调用msgrcv()的进程被信号中断。

用以上4个函数实现Linux系统下的通信。

四:实验结果与分析

 

结果分析:

程序首先创建一个消息队列,用于进程间的消息传递。使用msgget()函数创建消息队列,并指定消息队列的键值为MSGKEY。

然后程序通过调用fork()函数创建子进程。子进程中调用SERVER()函数作为服务器进程,父进程中调用CLIENT()函数作为客户端进程。

服务器进程通过调用msgrcv()函数接收消息,并打印出"(Server) received"。服务器进程会一直接收消息,直到接收到消息类型为1的消息。

客户端进程通过调用msgsnd()函数向消息队列发送消息,并打印出"(client) sent"。客户端进程发送10个不同类型的消息,从10到1。

服务器进程接收到消息类型为1的消息后,调用msgctl()函数删除消息队列,并退出进程。

主进程通过两次调用wait()函数等待子进程的结束。

分析:

客户端进程先运行,连续发送10个消息到消息队列。

服务器进程接收到第一个消息时打印"(Server) received",然后进入循环等待接收其他消息。

当服务器进程接收到类型为1的消息时,即第十个消息,打印"(Server) received"。

主进程等待子进程的结束。

请注意,由于进程调度的不确定性和消息传递的异步性,实际运行结果可能会有所不同。以上结果仅代表可能的一种情况。

五、小结与心得体会

1.进程间通信:这个实验通过消息队列实现了进程间的通信。服务器进程通过msgrcv()函数接收消息,客户端进程通过msgsnd()函数发送消息。消息队列提供了一种可靠的通信机制,使得进程可以在异步的情况下进行交互。

2.消息队列:消息队列是一种存放消息的容器,进程可以向队列中发送消息,也可以从队列中接收消息。每个消息都有一个消息类型,用于标识不同的消息。在这个实验中,服务器进程通过指定消息类型为0来接收所有类型的消息,直到接收到类型为1的消息。

3.进程间同步:在实验中,服务器进程在接收到特定类型的消息后才会退出。这种方式实现了进程间的同步,保证服务器进程在接收到指定的消息之前一直等待。

4.fork()函数的使用:实验中使用了fork()函数创建子进程。通过多次调用fork()函数,实现了创建服务器进程和客户端进程的目的。子进程会继承父进程的消息队列标识符,因此可以进行消息的发送和接收。

5.父子进程的协作:通过fork()函数创建的子进程在执行不同的函数,实现了父子进程的协作。客户端进程发送消息,服务器进程接收消息,彼此配合完成通信任务。

6.异步消息传递:由于消息传递是异步的,客户端进程可以快速发送多个消息,而服务器进程可以在自己的节奏下接收这些消息。这种异步性可以提高系统的响应速度和并发性能。

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

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

相关文章

企业级微服务架构实战项目--xx优选-小程序安装篇4

一 搭建微信小程序前端环境 1.1 申请小程序测试号 申请地址&#xff1a;微信公众平台 使用微信扫描二维码进行申请&#xff0c;申请成功之后&#xff0c;进入界面&#xff0c;获取小程序ID和秘钥 。 AppID(小程序ID) wx62bfe844fea3eba8 AppSecret(小程序密钥) …

JavaScript ES9新特性

文章目录 Object spread syntax&#xff08;对象扩展语法&#xff09;Promise.prototype.finally()Asynchronous Iteration&#xff08;异步迭代&#xff09;&#xff1a;Rest/Spread Properties&#xff08;剩余和扩展属性&#xff09;&#xff1a;RegExp named capture group…

Apikit 自学日记:导入、导出文档

一、导入API文档 功能入口&#xff1a;API管理应用 / 选中某个项目 / API文档菜单 / 点击“ API”按钮旁的下拉按钮 / 选中“导入API” Eolink提供一键导入已有API文档的功能&#xff0c;支持多种产品格式。常用于新项目创建后&#xff0c;需要对旧项目或旧软件内数据进行迁移…

认识设计组件帮助测试,以提高产品用户体验

一、控制元素 1、活动指示器——应与背景想协调&#xff0c;用于持续时间不明的进程&#xff0c;单一元素不显示&#xff0c;大于1个显示 2、加载控件——同一个专区页面&#xff0c;加载样式统一 3、页码控制器——原点最好控制在5点内&#xff0c;左右滑动&#xff0c;点击原…

OpenCL编程指南-5.5图像读、写函数

读图像 OpenCL GPU设备有专用硬件来读、写图像。OpenCL C图像读、写函数允许开发人员充分利用这个专用硬件。OpenCL 中的图像支持是可选的。要了解一个设备是否支持图像&#xff0c;可以使用clGetDeviceInfo API查询CL_DEVICE_IMAGE_SUPPORT属性。 需要说明的是&#xff0…

c4d+AI+PS设计广告展示架/销售柜台/展示盒子的建议

1、首先做出我标识出来的样子&#xff0c;这里称作A面。&#xff08;可用软件&#xff1a;PS、AI、cdr等&#xff09; 2、制作用于展示盒A面PNG图片&#xff08;PS来掏空空白处用于描边&#xff09;。 操作&#xff1a;按需求缩小图片&#xff0c;载入选区&#xff0c;新建图层…

three.js标准网格材质(MeshStandardMaterial)光照、粗糙度、金属度、法线属性介绍

如上图&#xff0c;在前面的章节中我们通过设置物体的纹理和材质实现了一个3d的立体门框的效果 完整代码如下&#xff1a; import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls&quo…

新媒体运营工作总结

新媒体运营工作总结篇1 一、大力提升新媒体平台的关注度。在当前掩盖全校60%的同学的基础上&#xff0c;进一步提高掩盖率&#xff0c;争取在未来一年中到达90%以上。为了增强平台与受众的互动与交流&#xff0c;吸引同学们的关注&#xff0c;可以展开更多同学们喜闻乐见的线上…

macOS FreeBSD 如何刷新 DNS 缓存

macOS FreeBSD 如何刷新 DNS 缓存 全文&#xff1a;如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, Debian, Ubuntu, Windows) 请访问原文链接&#xff1a;https://sysin.org/blog/how-to-flush-dns-cach…

(动态规划) 5. 最长回文子串 ——【Leetcode每日一题】

❓ 5. 最长回文子串 难度&#xff1a;中等 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a…

Pytest+Webdriver+Alluer的UI自动化测试框架

作为web自动化的入门学习&#xff0c;搭建框架练习下 一、熟悉项目的测试框架的整体目录 二、 PIP安装完所需框架 1、编写main.py import pytestif __name__ __main__:#pytest.main() # 遍历相同目录下的所以test开头的用例#生成测试报告 #一次执行所有接口测试用例&…

【消费战略方法论】3W消费战略作业方法

3W消费战略 以消费者为核心导向的 品牌战略 品牌本质上属于消费者&#xff0c;消费者是品牌战略的核心。所有品牌工作都应把握一个标准&#xff0c;即是否围绕着消费者&#xff0c;是否对消费者有价值。一切的品牌战略、策略、创意、营销等工作都应该是为了“消费者”而设…

【Java|多线程与高并发】定时器(Timer)详解

文章目录 1. 前言2. 定时器的基本使用3. 实现定时器4. 优化上述的定时器代码5. 总结 1. 前言 在Java中&#xff0c;定时器Timer类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行&#xff0c;或者以固定的时间间隔重复执行。 在服务器开发中,客户端向…

原型模式(Prototype)

定义 原型是一种创建型设计模式&#xff0c;使你能够复制已有对象&#xff0c;而又无需使代码依赖它们所属的类。 别名 克隆&#xff08;Clone&#xff09;。 前言 1. 问题 如果你有一个对象&#xff0c;并希望生成与其完全相同的一个复制品&#xff0c;你该如何实现呢&a…

基于工业智能网关的设备运维管理平台有何功能?

工业物联网平台作为监控工业设备和工业环境的智能应用&#xff0c;整合边缘和云端的数据优势&#xff0c;在制造业领域得到越来越丰富的应用。 在工业制造生产过程中&#xff0c;常常分为人、机、料、法、环等五大要素&#xff0c;其中机器设备的安全稳定运行时保证工厂生产效…

58同城AI Lab在WeNet中开源GPU热词增强功能

01 前言 端到端语音识别系统在足够多数据上训练后&#xff0c;往往能达到不错的识别效果&#xff0c;然而在实际应用场景中&#xff0c;对于不常见的专有名词&#xff0c;例如人名、产品名、小区名等&#xff0c;往往容易识别错误&#xff0c;此类问题需要快速修复&#xff0c…

DNS是什么?DNS的工作流程

79. DNS是什么&#xff1f; DNS&#xff08;Domain Name System&#xff09;是一种用于将域名解析为相应IP地址的分布式命名系统&#xff0c;了解DNS对于理解域名解析原理和优化网络请求非常重要。本篇文章将介绍DNS的概念、工作原理以及在前端开发中的应用&#xff0c;帮助前…

正则表达式-捕获组,命名捕获组,非捕获组

正则表达式的作用 测试目标字符串是否符合规则 返回true/false按照规则从目标字符串提取内容 返回匹配的数组 在线测试工具 regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, …

java适配达梦数据库

目录 一、数据库安装 二、数据库可视化工具 三、数据迁移 四、工程适配 新增maven依赖 配置文件修改 基于flyway的数据库版本管理 五、注意事项 一、数据库安装 官方文档&#xff1a;安装前准备 | 达梦技术文档 这里有一个点需要注意&#xff0c;如果你之前的数据库或…

【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

Java高级语法详解之方法引用 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法形式3.2 案例 4️⃣ 应用场景5️⃣ 注意事项&#x1f33e; 总结 1️⃣ 概念 方法引用是Java编程语言中的一个重要特性&#xff0c;它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambd…