操作系统 大作业

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 即可获取」

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移植案例与原理 - HDF驱动框架-驱动配置(1)

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码&#xff0c;内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦&#xff0c;便于开发者进行配置管理。应该&#xff0c;类似Linux DTS(Device Tree Source)设备树。 HC-GEN(HDF Configuration Generator)是…

质检迈入新时代,天润融通推出基于大模型的质检3.0解决方案

近18个月以来&#xff0c;受益于生成式AI浪潮&#xff0c;千行百业迎来了前所未有的突破与变革。 今天我们荣幸地站在时代交汇点上&#xff0c;宣布天润融通正式推出基于大语言模型的质检3.0产品&#xff0c;文末扫码申请试用。 在揭示质检3.0的里程碑之前&#xff0c;让我们…

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w

01 中国电信股份有限公司浙江分公司 &#x1f537;招聘岗位&#xff1a;系统架构师 &#x1f537;岗位职责&#xff1a; 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护&#xff0c;做好相关产数项目的支撑。 2、根据信息安全管理要求&#xff0c;负责客户…

MPLS静态配置实验(初学版)

实验拓扑 配置接口地址 配置OSPF协议 测试网络连通性 配置静态MPLS AR1&#xff1a; [R1]mpls lsr-id 1.1.1.1 [R1]mpls [R1-GigabitEthernet0/0/0]mpls [R1]static-lsp ingress wps destination 4.4.4.4 32 nexthop 10.1.12.2 outgoing-interface g0/0/0 out-label 100AR2 [R2…

韩顺平0基础学java——第26天

p523-547 HashSet扩容时&#xff0c;只要节点到达了阈值就会扩&#xff0c;而不是数组长度到了才扩。 比如长16的数组&#xff0c;索引1放了8个&#xff0c;索引3放了4个&#xff0c;我再加一个他就会扩容。 另外谁能告诉我老师的debug界面是怎么设置的吗忘光了 HashSet存放…

shell脚本之数组及冒泡排序

1.数组定义&#xff1a;在集合当中指定多个元素&#xff0c;元素的类型可以是整数、字符串及浮点。 2.数组作用&#xff1a;一次性的定义多个元素&#xff0c;可以为变量赋值提供便利。 3.数组的定义方法&#xff1a; 数组名&#xff08;a b c d&#xff09; 数组名不能重复…

Qt6视频播放器项目框架代码

视频播放的关键代码如下: 使用Qt6的QMediaPlayer,QVideoWidget实现 void FunnyWidget::initVideo() {player = new QMediaPlayer(this);videoWidget = new QVideoWidget(this);playButton = new QPushButton("Play", this);pauseButton = new QPushButton("…

【Ruby基础01】windows和termux中搭建Ruby开发环境

windows下环境搭建 railsinstaller官方git地址 按照文档安装git、nodejs、yarn&#xff0c;安装教程百度一下。railsinstall可以从release页面下载最新版本4.1.0。 安装完成如下 安装RubyMine 下载RubyMine RubyMine下载地址 安装激活 下载文件&#xff0c;按照里面的流程…

《算法设计与分析》第五六章:回溯法与分支限界法

文章目录 回溯法分支限界法一、本章作业1.活动安排问题2.旅行商问题3.单源最短路径4.任务分配问题 二、算法积累1.回溯法求解01背包问题2.回溯法求解最大团问题3.回溯法求解n皇后问题4.回溯法求解地图着色5.回溯法求解哈密尔顿图6.回溯法求活动安排7.分支限界法求01背包问题8.分…

手写MyBatis 重要基本原理框架

1. 手写MyBatis 重要基本原理框架 文章目录 1. 手写MyBatis 重要基本原理框架1.1 第一步&#xff1a;IDEA中创建模块1.2 第二步&#xff1a;资源工具类&#xff0c;方便获取指向配置文件的输入流1.3 第三步&#xff1a;定义SqlSessionFactoryBuilder类1.4 第四步&#xff1a;分…

再进一步!deepin V23成功适配SpacemiT MUSE™ Box

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 deepin作为国内领先的Linux操作系统发行版&#xff0c;一直致力于为用户提供更广泛的硬件支持&#xff0c;并积极投身于蓬勃发展的RISC-V生态建设。自deepin-ports SIG&#xff08;特别兴趣小组&#xff09;成立以…

WSL2 无法将磁盘”C:\Program Files\WSL\system.vhd“ 附加到WSL2 系统找不到指定的文件

WSL2 无法将磁盘”C:\Program Files\WSL\system.vhd“ 附加到WSL2 系统找不到指定的文件 开局就是雷蹦开局就是雷蹦 早上上班,一开机直接崩溃了,这啥问题,这个文件我哪里敢删除不是。肯定不是我的问题,我不看。心里默默告诉自己,一切都是状态机。确定了一下,首先确实存在…

类注释规范

类注释规范 1.1.1 模板配置 模板路径&#xff1a;File–>settings–>Editor–>File and Code Templates–>Includes–>File Header  N A M E &#xff1a;设置类名&#xff0c;与下面的 {NAME}&#xff1a;设置类名&#xff0c;与下面的 NAME&#xff1a;设…

gitee添加别人的仓库后,在该仓库里添加文件夹/文件

一、在指定分支里添加文件夹&#xff08;如果库主没有创建分支&#xff0c;自己还要先创建分支&#xff09; eg:以在一个项目里添加视图文件为例&#xff0c;用Echarts分支在usr/views目录下添加Echarts文件夹&#xff0c;usr/views/Echarts目录下添加index.vue 1.切换为本地仓…

C++之STL(二三)

1、vector源码刨析 1.1、数据结构以及动态扩充算法 其实vector内部有三个指针&#xff0c;分别是数据的第一个元素Myfirst、数据的最后一个元素的下一个位置Mylast&#xff0c;最后一个空间的下一个位置Myend&#xff1b;当你插入数据的时候&#xff0c;先判断当前容量够不够&…

浅谈RC4

一、什么叫RC4&#xff1f;优点和缺点 RC4是对称密码&#xff08;加密解密使用同一个密钥&#xff09;算法中的流密码&#xff08;一个字节一个字节的进行加密&#xff09;加密算法。 优点&#xff1a;简单、灵活、作用范围广&#xff0c;速度快 缺点&#xff1a;安全性能较差&…

昇思大模型学习·第一天

mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…

LoRA用于高效微调的基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) 大型语言模型的低秩适配&#xff08;LoRA&#xff09;用于解决微调大型语言模型&#xff08;LLMs&#xff09;的挑战。GPT和Llama等拥有数十亿参数的模型&#xff0c;特定任务或领域的微…

chrome 录制器及性能分析工具的使用

需求背景&#xff1a; 对比不同VPN方案网络延迟的差异。 验证工具&#xff1a; chrome浏览器自带的录制器、性能插件可以完美的解决这个问题。 注意&#xff1a;录制的操作都在当前页面&#xff0c;不存在新开标签页的场景 解决方案&#xff1a; 使用chrome录制器&#xf…