操作系统 大作业

1、现有成绩文件按“姓名 学校 年级 班级 分数”五列组成,编写Shell脚本,将某目录下所有成绩文件(≥3个)合并为一个,形成“姓名 班级 分数”三列,并按成绩排序,输出年级排名前十。同时输出60以下、60-70、70-80、80-90、90-100各分数区间人数,并统计所有人的平均分。(25分)

先创建三个成绩文件

touch score1.txt score2.txt score3.txt

需要填入内容,以下为随机生成的内容

score1.txt

Aaaa ZhengzhouUniversity 2021 1 76
Alice ZhengzhouUniversity 2021 4 5  
Bob ZhengzhouUniversity 2021 9 87  
Charlie ZhengzhouUniversity 2021 7 92  
David ZhengzhouUniversity 2021 1 15  
Eve ZhengzhouUniversity 2021 2 55  
Frank ZhengzhouUniversity 2021 5 32  
Grace ZhengzhouUniversity 2021 8 68  
Hannah ZhengzhouUniversity 2021 10 7  
Isaac ZhengzhouUniversity 2021 6 23  
Jane ZhengzhouUniversity 2021 3 41

score2.txt

Bbbb ZhengzhouUniversity 2021 2 57
Kevin ZhengzhouUniversity 2021 9 99  
Laura ZhengzhouUniversity 2021 7 8  
Michael ZhengzhouUniversity 2021 5 51  
Nina ZhengzhouUniversity 2021 2 12  
Oliver ZhengzhouUniversity 2021 1 95  
Patricia ZhengzhouUniversity 2021 8 39  
Quentin ZhengzhouUniversity 2021 3 25  
Rache ZhengzhouUniversity 2021l 6 75  
Sarah ZhengzhouUniversity 2021 4 61  
Tom ZhengzhouUniversity 2021 10 48  
Ursula ZhengzhouUniversity 2021 9 18  
Victoria ZhengzhouUniversity 2021 7 82

score3.txt

Cccc ZhengzhouUniversity 2021 3 89
William ZhengzhouUniversity 2021 5 9  
Xavier ZhengzhouUniversity 2021 2 65  
Yvonne ZhengzhouUniversity 2021 8 100  
Zachary ZhengzhouUniversity 2021 4 36  
Anna ZhengzhouUniversity 2021 3 78  
Benjamin ZhengzhouUniversity 2021 6 58  
Cassandra ZhengzhouUniversity 2021 1 45  
Daniel ZhengzhouUniversity 2021 10 28  
Eleanor ZhengzhouUniversity 2021 9 85

创建一个目录,把这三个成绩文件放入其中

mkdir score
mv score1.txt score2.txt score3.txt score

scores.sh

#!/bin/bash   
# 指定目录和输出文件名  
input_dir="/root/score"   
output_file="merged_scores.txt"    
# 检查目录下文件数量  
files=($(find "$input_dir" -maxdepth 1 -type f -name "*.txt"))  
if [ ${#files[@]} -lt 3 ]; then  echo "Error: Less than 3 files found in the directory."  exit 1  
fi  # 合并所有文件为三列格式  
> "$output_file"  
for file in "${files[@]}"; do  awk '{print $1, $4, $5}' "$file" >> "$output_file"  
done  # 按成绩排序并输出年级排名前十  
sort -nr -k3 "$output_file" | head -n 10    
# 统计各分数区间的人数和所有人的平均分  
awk '  
BEGIN {  count = 0  sum = 0  count_a = 0  count_b = 0  count_c = 0  count_d = 0  count_e = 0  
}  
{  score = $3  sum += score  count++  if (score < 60) count_a++  else if (score >= 60 && score < 70) count_b++  else if (score >= 70 && score < 80) count_c++  else if (score >= 80 && score < 90) count_d++  else if (score >= 90 && score <= 100) count_e++  
}  
END {  avg = sum / count  print "60以下:", count_a  print "60-70:", count_b  print "70-80:", count_c  print "80-90:", count_d  print "90-100:", count_e  print "平均分:", avg  
}  
' "$output_file"

执行:./scores.sh

2、系统中有生产者、计算者和消费者3个线程,共享2个容量为n(n≥4)的缓冲区buffer1和buffer2,生产者随机产生小写字母,并放入到buffer1;计算者从buffer1取出字母,将小写字母转换为大写字母,放入到buffer2;消费者从buffer2取出字符,将其打印到屏幕上。试用使用信号量解决生产者、计算者、消费者问题。(25分)

convert.c

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h> // 需要包含time.h头文件来使用time函数 
#define N 6 // 缓冲区容量char buffer1[N]; // 缓冲区1
char buffer2[N]; // 缓冲区2
int in1 = 0; // 缓冲区1的索引
int out1 = 0; // 缓冲区1的索引
int in2 = 0; // 缓冲区2的索引
int out2 = 0; // 缓冲区2的索引sem_t empty1, full1, empty2, full2; // 信号量void *producer(void *arg) {  // 使用当前时间作为随机数生成器的种子  srand(time(NULL));  while (1) {sem_wait(&empty1); // 等待空位buffer1[in1] = 'a' + rand() % 26; // 随机产生小写字母printf("Producer produced %c\n", buffer1[in1]);in1 = (in1 + 1) % N;sem_post(&full1); // 通知有新的数据}
}void *computer(void *arg) {while (1) {sem_wait(&full1); // 等待数据sem_wait(&empty2); // 等待空位buffer2[in2] = toupper(buffer1[out1]); // 转换为大写字母printf("Computer computed %c\n", buffer2[in2]);out1 = (out1 + 1) % N;in2 = (in2 + 1) % N;sem_post(&full2); // 通知有新的数据}
}void *consumer(void *arg) {while (1) {sem_wait(&full2); // 等待数据printf("Consumer consumed %c\n", buffer2[out2]);out2 = (out2 + 1) % N;sem_post(&empty2); // 通知有空位}
}int main() {pthread_t tid1, tid2, tid3;sem_init(&empty1, 0, N); // 初始化信号量sem_init(&full1, 0, 0);sem_init(&empty2, 0, N);sem_init(&full2, 0, 0);pthread_create(&tid1, NULL, producer, NULL); // 创建线程pthread_create(&tid2, NULL, computer, NULL);pthread_create(&tid3, NULL, consumer, NULL);pthread_join(tid1, NULL); // 等待线程结束pthread_join(tid2, NULL);pthread_join(tid3, NULL);sem_destroy(&empty1); // 销毁信号量sem_destroy(&full1);sem_destroy(&empty2);sem_destroy(&full2);return 0;
}

编译链接命令:gcc convert.c -o convert

运行命令:./convert

3、通过Linux中的socket通信机制,编写C程序,完成猜数字的游戏。服务端自动生成1~100的随机数,客户端猜数字。猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。(25分)

sever.c

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <time.h>  #define PORT 8080  
#define BUF_SIZE 1024  int main() {  int server_fd, new_socket;  struct sockaddr_in address;  int addrlen = sizeof(address);  char buffer[BUF_SIZE] = {0};  srand(time(0)); // 初始化随机数种子  int secret_number = rand() % 100 + 1; // 生成1~100的随机数  // 创建socket  if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {  perror("socket failed");  exit(EXIT_FAILURE);  }  // 设置地址  address.sin_family = AF_INET;  address.sin_addr.s_addr = INADDR_ANY;  address.sin_port = htons(PORT);  // 绑定  if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {  perror("bind failed");  exit(EXIT_FAILURE);  }  // 监听  if (listen(server_fd, 3) < 0) {  perror("listen");  exit(EXIT_FAILURE);  }  // 接受连接  if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {  perror("accept");  exit(EXIT_FAILURE);  }  // 与客户端交互  while (1) {  memset(buffer, 0, BUF_SIZE);  // 接收猜测  read(new_socket, buffer, BUF_SIZE - 1);  int guess = atoi(buffer);  if (guess > secret_number) {  write(new_socket, "Too high!", 9);  } else if (guess < secret_number) {  write(new_socket, "Too low!", 8);  } else {  write(new_socket, "Correct!", 7);  break;  }  }  // 关闭连接和socket  close(new_socket);  close(server_fd);  return 0;  
}

client.c

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>    
#define PORT 8080  
#define BUF_SIZE 1024  int main() {  int sock = 0, valread;  struct sockaddr_in serv_addr;  char buffer[BUF_SIZE] = {0};  int guess;  // 创建socket  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  printf("\n Socket creation error \n");  return -1;  }  serv_addr.sin_family = AF_INET;  serv_addr.sin_port = htons(PORT);  // 假设服务端IP是127.0.0.1  if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {  printf("\nInvalid address/ Address not supported \n");  return -1;  }  // 连接到服务端  if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {  printf("\nConnection Failed \n");  return -1;  }  // 开始猜数字游戏  while (1) {  printf("Enter your guess (1-100): ");  scanf("%d", &guess);   // 发送猜测  snprintf(buffer, BUF_SIZE, "%d", guess);  write(sock, buffer, strlen(buffer));  // 接收反馈  memset(buffer, 0, BUF_SIZE);  valread = read(sock, buffer, BUF_SIZE - 1);  printf("%s\n", buffer);  // 检查是否猜对  if (strstr(buffer, "Correct!") != NULL) {  printf("Congratulations! You guessed the number correctly.\n");  break;  }  }  // 关闭socket  close(sock);    return 0;  
}

实验结果:

 4、在Linux 0.12(0.11)上添加两个系统调用,第一个系统调用将字符串内容拷贝到内核中保存下来,第二个系统调用将保存的字符串再拷贝到用户空间。编译并运行添加过新系统调用的Linux系统,要求给出系统调用代码的注释,及系统调用添加、编译和运行时的截图。(25分)

这题是哈工大操作系统实验课的第三个实验,下面提供了课程链接,参与课程就有Linux0.11的实验环境了,后面的自己做吧。

https://www.lanqiao.cn/courses/115

最后,交大作业也是到期末的时候了,以下提供 操作系统第五版费祥林 电子课本和课后答案的链接,祝期末顺利。

通过百度网盘分享的文件:
链接:https://pan.baidu.com/s/1z3KIUaqTRL-0zHPamyk-Bw?pwd=n11p 
提取码:n11p
复制这段内容打开「百度网盘APP 即可获取」

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

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

相关文章

实现一个渐进优化的 Linux cp 命令

1&#xff0c;第1版 copy 先写个轮廓 selfcp.c &#xff1a; #include <stdio.h>int main() {FILE *source, *destination;char ch;source fopen("H222.txt", "r");if (source NULL) {printf("Error opening source file!\n");retur…

8.华为两台交换机的三种连接方式access 、trunk、undo portswitch

目的&#xff1a;两台三层交换机的三种连接方式 1.access 2.trunk 3.undo portswitch 模拟机不支持此配置&#xff0c;实体机支持 第一种access CE1配置 [~HUAWEI]vlan batch 10 [~HUAWEI]int Vlanif 10 [~HUAWEI-Vlanif10]ip add 10.10.10.1 24 [~HUAWEI]int g1/0/0 [~HUAWE…

卫士通电科网安安全IpSec网关Ukey开发对接

官方公开的开发文档&#xff0c;有几个坑&#xff0c;着重说一下踩坑的记录过程。 1、通过官方的客户端接口模拟程序获取前端参数&#xff1a;随机数和token 2、java程序调用官方sdk&#xff0c;postman请求测试&#xff1a; 3、贴出关键的java集成类&#xff1a; import cn.h…

shell脚本 函数

函数 shell的函数 定义&#xff1a;将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {} do 命令序列 done if [ ] then 命令序列 fi 作用&#xff1a;方便重复使用。函数库&#xff0c;集中在一起&#xff0c;随时可以传参调用。大的工…

SpringMVC系列五: SpringMVC映射请求数据

SpringMVC映射请求数据 &#x1f49e;获取参数值说明应用实例 &#x1f49e;获取http请求消息头&#x1f49e;获取JavaBean对象使用场景说明应用实例注意事项和细节 &#x1f49e;获取servlet api说明应用实例注意事项和细节 上一讲, 我们学习的是SpringMVC系列四: Rest-优雅的…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台&#xff0c;允许你将应用程序及其依赖项打包在容器中。使用 Docker&#xff0c;你可以创建一个包含 Vue.js 应用程序的容器镜像&#xff0c;并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

Eureka 学习笔记(1)

一 、contextInitialized() eureka-core里面&#xff0c;监听器的执行初始化的方法&#xff0c;是contextInitialized()方法&#xff0c;这个方法就是整个eureka-server启动初始化的一个入口。 Overridepublic void contextInitialized(ServletContextEvent event) {try {init…

无声短视频:成都柏煜文化传媒有限公司

无声短视频&#xff1a;视觉艺术的独特魅力 在数字化时代的浪潮中&#xff0c;短视频以其简短、直观、易于传播的特点迅速崛起&#xff0c;成为当下最热门的媒体形式之一。而在众多的短视频类型中&#xff0c;无声短视频以其独特的视觉表达方式&#xff0c;逐渐吸引了越来越多…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

leetcode118 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] public List…

信创服务器操作系统的适配迁移分析

浅谈信创服务器操作系统的适配迁移 01 服务器操作系统迁移适配流程复杂 随着CentOS停服临近和红帽RHEL源码权限受限&#xff0c;服务器操作系统安全漏洞风险加剧。国内众多企业面临CentOS、REHL等系统升级替换的挑战。同时&#xff0c;出于安全、功能升级和合规需求&#xff0…

33、循环语句--函数---递归+阶乘

一、函数 1.1、shell的函数 1.1.1、函数的定义&#xff1a;将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {}do命令序列doneif []then 命令序列else命令序列fi #可以作为一个命令序列作用&#xff1a;方便重复使用&#xff0c;函数库&…

CubeMx打不开

问题点&#xff1a;打开CubeMx一直这个界面&#xff0c;然后就消失了。 问题所在&#xff1a;java版本过高。 博主的版本是合适的&#xff0c;如果你的版本是17什么的肯定是不合适的。 解决方法&#xff1a;卸载重装 卸载工具站内下载&#xff0c;免安装&#xff1a;&#xf…

极速解析,精准合规 — Ada,现代C++的URL解析器

Ada&#xff1a;用Ada&#xff0c;让URL解析变得轻而易举。- 精选真开源&#xff0c;释放新价值。 概览 Ada是一个用现代C编写的快速且符合WHATWG标准的URL解析库。它通过了WHATWG网站提供的全部规范测试&#xff0c;并在包括Windows、Linux、macOS在内的多个平台上表现卓越。…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 引言 编写一篇高质量的博客文章并非易事&#xff0c;尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言&#xff0c;为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

反射的原理和操作

反射是框架设计的灵魂 &#xff08;使用的前提条件&#xff1a;必须先得到代表的字节码的Class&#xff0c;Class类用于表示.class文件&#xff08;字节码&#xff09;&#xff09; 在Java中&#xff0c;反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI&#xff08;powered by LLM&#xff09;和Headless BI&#xff08;powered by 语义层&#xff09;打造新一代的BI平台。这种融合确…

C++ 66 之 类模版

#include <iostream> #include <string> using namespace std;// 习惯性 < >中 类模板用class 普通的函数模板就用typename // template<class NAMETYPE, class AGETYPE> template<class NAMETYPE, class AGETYPE int> // 可以设置默认的类型值…

【数据结构C++】表达式求值(多位数)课程设计

&#x1f4da;博客主页&#xff1a;Zhui_Yi_ &#x1f50d;&#xff1a;上期回顾&#xff1a;图 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f387;追当今朝天骄&#xff0c;忆顾往昔豪杰。 …

【机器学习】第7章 集成学习(小重点,混之前章节出题但小题)

一、概念 1.集成学习&#xff0c;顾名思义&#xff0c;不是一个玩意&#xff0c;而是一堆玩意混合到一块。 &#xff08;1&#xff09;基本思想是先 生成一定数量基学习器&#xff0c;再采用集成策略 将这堆基学习器的预测结果组合起来&#xff0c;从而形成最终结论。 &#x…