操作系统课程设计-Linux 进程间通信

目录

 

前言

1 实验题目

2 实验目的

3 实验内容

3.1 步骤

3.2 关键代码

3.2.1 Server和Client的创建

3.2.2 Server核心代码

3.2.3 Server核心代码

4 实验结果与分析

5 代码


前言

         本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是Ubuntu 22.04 LTS,代码均是在终端进行编译的,不会的可以先了解怎么用终端编程,或者利用其他较为智能的开发环境进行编程

1 实验题目

        实验三 Linux进程间通信

2 实验目的

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

3 实验内容

3.1 步骤

        (1)步骤1:为了便于操作和观察结果,用一个程序作为“引子”,先后 fork()两个子进程SERVER和CLIENT,进行通信。

        (2)步骤2:SERVER 端建立一个 key 为 75 的消息队列,等待其他进程发来的消息。当遇到类型为 1 的消息,则作为结束信号,取消该队列,并退出 SERVER。SERVER 每接收到一个消息后显示一句“(server) received”。

        (3)步骤3:CLIENT 端使用 key 为 75 的消息队列,先后发送类型从 10 到 1 的消息,然后退出。 最后的一个消息,即是 SERVER 端需要的结束信号。CLIENT 每发送一条消息后显示一句“(client)sent”。

        (4)步骤4:父进程在SERVER和CLIENT均退出后结束。

3.2 关键代码

3.2.1 Server和Client的创建

    while((i=fork())==-1);if(!i) SERVER();while((i=fork())==-1);if(!i) CLIENT();

3.2.2 Server核心代码

    msgqid=msgget(MSGKEY,0777|IPC_CREAT);do{msgrcv(msgqid,&msg,1030,0,0);printf("(Server) recieved %d\n",msg.mtype);} while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);

3.2.3 Server核心代码

    int i;msgqid=msgget(MSGKEY,0777);for (i=10;i>=1;i--){ msg.mtype=i;printf("(client) sent %d\n",i);msgsnd(msgqid,&msg,1024,0);}

4 实验结果与分析

在终端执行程序后,会看到当Client输出完之后才会有Server的输出,与理论上的一个Client输出对应一个Server接收不相符合,这进一步说明在多进程的情况下,程序的执行结果不可预测。其结果如下图所示:

图1.2 实验2-2步骤2

5 代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#define MSGKEY 75
struct msgform {long mtype;char mtext[1030];
} msg;
int msgqid,i;
void CLIENT() {int i;msgqid=msgget(MSGKEY,0777);for (i=10; i>=1; i--) {msg.mtype=i;printf("(client) sent %d\n",i);msgsnd(msgqid,&msg,1024,0);}exit(0);
}
void SERVER() {msgqid=msgget(MSGKEY,0777|IPC_CREAT);do {msgrcv(msgqid,&msg,1030,0,0);printf("(Server) recieved %d\n",msg.mtype);} while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);exit(0);
}
void main() {while((i=fork())==-1);if(!i) SERVER();while((i=fork())==-1);if(!i) CLIENT();wait(0);wait(0);
}

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

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

相关文章

BuildRoot配置RTL8822CE WIFIBT模块(WIFI部分)

TinkerBoard2主板自带的无线模块为RTL8822CE&#xff0c;PCIe接口 之前在风火轮下载的Linux源码编译出来的BuildRoot根文件系统没有相关的驱动文件 [rootrk3399:/]# find . -name *.ko [rootrk3399:/]# lsmod Module Size Used by Not tainted [rootrk33…

Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中

文章目录 前言实现项目启动时加载枚举值到Redis1. 定义EnumInterface接口2. 创建EnumDTO3. 创建ClassUtils工具类4. 创建EnumService接口5. 创建EnumServiceImpl6. 修改枚举类7. 创建ApplicationInit 测试结果 前言 新的一年即将来到&#xff0c;回首2023年&#xff0c;也是学…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

Redis和MySQL如何保持数据一致性

前言 在高并发的场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。所以&#xff0c;我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求。但是&#xff0c;Mysql和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键…

科大讯飞星火大模型接入API js 部分 接口 安装注意事项

下载以下链接例子运行程序 https://xfyun-doc.xfyun.cn/static%2F16968175055332330%2Fspark_js_demo.zip 官网给的说明 准备 1.在demo中填写APPID、APISecret、APIKey&#xff0c;可到控制台-我的应用-大模型页面获取 2.安装nodejs 本地运行 1.打开cmd&#xff0c;进入dem…

CORS漏洞学习

CORS漏洞属于一个协议漏洞&#xff0c;具体是由于同源策略的设置问题触发的漏洞&#xff0c;漏洞利用条件较为苛刻&#xff0c;但实战中也常见。 首先要了解同源策略 什么是同源策略&#xff1f; 同源策略是一种Web浏览器安全机制&#xff0c;旨在防止网站相互攻击。 同源策…

网络安全的威胁PPT

建议的PPT免费模板网站&#xff1a;http://www.51pptmoban.com/ppt/ 此PPT模板下载地址&#xff1a;https://file.51pptmoban.com/d/file/2023/03/20/1ae84aa8a9b666d2103f19be20249b38.zip 内容截图&#xff1a;

刷题总结1.17 下午

第五题的平面图&#xff0c;偶图不理解 第三题为什么使用克鲁斯卡尔算法&#xff1f; 旅行商问题&#xff08;Traveling Salesman Problem&#xff0c;TSP&#xff09;是一个著名的组合优化问题&#xff0c;描述的是一个旅行商要在给定的一系列城市之间找到最短的路径&#xff…

MySQL下对[库]的操作

目录 创建数据库 创建一个数据库案例&#xff1a; 字符集和校验规则&#xff1a; 默认字符集&#xff1a; 默认校验规则&#xff1a; 查看数据库支持的字符集&#xff1a; 查看数据库支持的字符集校验规则&#xff1a; 校验规则对数据库的影响&#xff1a; 操作数据…

HCIA——10实验:跨路由转发。静态路由、负载均衡、缺省路由、手工汇总、环回接口。空接口与路由黑洞、浮动静态。

学习目标&#xff1a; 跨路由转发、负载均衡、环回接口、手工汇总、缺省路由、空接口与路由黑洞、浮动静态 学习内容&#xff1a; 跨路由转发静态路由、负载均衡、缺省路由、手工汇总。环回接口空接口与路由黑洞、浮动静态 目录 学习目标&#xff1a; 学习内容&#xff1a…

基于Springboot的摄影分享网站系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的摄影分享网站系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

linux基础学习(2):磁盘管理、分区、格式化

1.一些基本概念 一块磁盘从加入到可使用&#xff0c;需要经过3个阶段&#xff1a;分区-格式化-挂载。 1.1分区方式 linux有2种分区方式&#xff1a; &#xff08;1&#xff09;mbr&#xff1a;最大支持2.1T硬盘&#xff0c;最多支持4个分区。这4个分区可以全部为主分区&…