当前位置: 首页 > news >正文

os实训课程模拟考试(大题复习)

目录

一、Linux操作系统

(1)第1关:Linux初体验 

(2)第2关:Linux常用命令

(3)第3关:Linux 查询命令帮助语句

二、Linux之进程管理—(重点)

(1)第1关:获取进程常见属性

(2)第2关:进程创建操作-fork

(3)第3关:进程创建操作-vfork

(4)第4关:进程终止

三、生产者消费者问题实践

(1)第1关:生产者消费者问题实践

(2)第2关:进程互斥和同步

四、基于信号量的进程间通信

(1)第1关:信号量IPC操作考查

五、基于命名管道与信号的进程间通信

(1)第1关:命名管道与信号IPC操作考查

六、 Linux vi/vim编辑器(难度:简单)

(1)第1关:vi/vim基本用法

(2)第2关:vi/vim工作模式切换

(3)第3关:vi/vim命令模式

(4)第4关:vi/vim底线命令模式(重点)

七、读文件系统函数(难度:简单)

(1)第1关:读文件系统函数

八、写文件系统函数(难度:中等)

(1)第1关:写文件系统函数

 九、进程基础操作(难度:简单)

(1)第1关:进程基础操作考察


本篇博客的主要内容是在做大题时遇到的问题和一些总结(具体答案看我之前的博客)

一、Linux操作系统

(1)第1关:Linux初体验 

(2)第2关:Linux常用命令
  • newfile文件复制一份到newdir目录下并命名为newfileCpy
  • cp newfile newdir/newfileCpy

(3)第3关:Linux 查询命令帮助语句
  • linux中使用man命令来查询命令的帮助文件

二、Linux之进程管理—(重点

(1)第1关:获取进程常见属性
  • 获取进程本身的进程ID的系统调用函数是getpid()
  • 获取父进程的进程ID的系统调用函数是getppid()
(2)第2关:进程创建操作-fork
  • 这题需要注意的地方:pid_t pid =fork();
(3)第3关:进程创建操作-vfork
  • 这题需要注意的地方:pid_t pid = vfork();
  • 子进程中输出"Children"字符串(提示:需要换行)
(4)第4关:进程终止
  • 用这个注册函数:atexit()on_exit()调用成功返回0调用失败返回一个非零值
 void exit(){printf("%d",getpid());}if(atexit(exit)){}

三、生产者消费者问题实践

(1)第1关:生产者消费者问题实践
  • 观察题目代码给出的生产者函数。根据这个来写!!
  • sem_t empty; :类似等待一个信号(生产)

  • sem_t full; :类似等待一个信号(消费)

  • sem_wait(&empty);
  • sem_wait(&full);

    (在每一个操作时和释放时都要记得加锁解锁

  • 加锁 pthread_mutex_lock(&mutex);
  • 释放锁 pthread_mutex_unlock(&mutex);

锁对象:pthread_mutex_t mutex;


  • 设置一个参数(仿照生产者函数)int nextc = 0;
  • 先给一个等待消费条件:sem_wait(&full);
  • 再加锁:pthread_mutex_lock(&mutex);
  • 意思是:从之前生产了的东西拿东西出来消费:nextc=buffer[out];

  • 与生产者函数中用到的一样:int out = 0;

  • 这个跟着改:printf("Consume one message:%d\n", nextc);

  • fflush(stdout);  //printf后请一定调用这句刷新输出缓存out = (out + 1) % SIZE;

  • out = (out + 1) % SIZE; (这个跟生产者函数一样,对着改就行)
  • pthread_mutex_unlock(&mutex);   ——> 再解锁

最后记得给一个消费完的信号:sem_post(&empty); 。意思其实就是消费完,给一个叫"空"的信号。


具体的答案《消费:Consumer()函数》

void *Consumer()
{// ============================= begin ======================//请补充消费者线程函数代码int nextc = 0;int i = 0;for(; i < 10; ++i){  int time = rand() % 10 + 1;usleep(time*100000); sem_wait(&full); pthread_mutex_lock(&mutex);nextc=buffer[out];printf("Consume one message:%d\n", nextc);fflush(stdout);//printf后请一定调用这句刷新输出缓存out = (out + 1) % SIZE;pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&empty);}// ============================= end ========================}

对比题目提供的《生产函数:Producer()》

int in = 0;
int out = 0;
int buffer[SIZE];
sem_t empty;
sem_t full;
pthread_mutex_t mutex;void *Producer()
{int nextp = 0;int i = 0;for(; i < 10; ++i){  int time = rand() % 10 + 1;usleep(time*100000); sem_wait(&empty); pthread_mutex_lock(&mutex);buffer[in] = nextc;printf("Produce one message:%d\n", nextp);fflush(stdout);//printf后请一定调用这句刷新输出缓存in = (in + 1) % SIZE;pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&full);}
}
(2)第2关:进程互斥和同步

(这个就简单了!!结合上面学的东西,以及仿照这个题目女儿的"苹果"消费函数写就好

  • 把消费等待的信号换成"orange(桔子)"
  • 把printf(....)输出换一下就好了
  • 儿子消费函数答案
void *Son()
{// ============================== begin ===========================//请添加儿子线程的函数代码while(1){int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒usleep(time * 100000);        sem_wait(&orange); pthread_mutex_lock(&mutex);printf("儿子取了一个桔子\n") ;fflush(stdout);pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&empty);}// ============================== end ==============================
}

四、基于信号量的进程间通信

(1)第1关:信号量IPC操作考查
  • 搞清楚函数:semctl(int semid,int semnum,int cmd,...);
  • semid要操作的信号量集合:(题目中给出变量:"int semid;")
  • semnum集合中信号量的编号(题目中就是:"i")
  • cmd执行的操作:(题目中有提示:#define GETVAL 获取信号量的值返回信号的值

具体答案如下:

(此代码不严谨!!因为没有判断是否函数调用成功!但是满足评测要求)

 for ( i = 0 ; i < MAX_SEMAPHORES ; i++ ){// =================================== begin ===============================/*请调用semctl函数,读取并输出与上述数组输出相同的输出*/// 注意:getval_arg.val 在这里不需要设置,因为 GETVAL 不使用它  int x = semctl(semid, i, GETVAL);  printf("Semaphore %d, value %d\n", i, x); // =================================== end ===============================}

更完整、更严谨的答案:
(记得还要在顶部导入包:#include <stdlib.h>   //以使用exit函数)

for ( i = 0 ; i < MAX_SEMAPHORES ; i++ ){// =================================== begin ===============================/*请调用semctl函数,读取并输出与上述数组输出相同的输出*/// 注意:getval_arg.val 在这里不需要设置,因为 GETVAL 不使用它  int x = semctl(semid, i, GETVAL);  if (x == -1) {  printf("GETVAL for semaphore %d failed (%d)\n", i, errno);  exit(EXIT_FAILURE);  }printf("Semaphore %d, value %d\n", i, x); // =================================== end ===============================}

五、基于命名管道与信号的进程间通信

(1)第1关:命名管道与信号IPC操作考查

没啥好说的,不会的操作系统考试就靠记呗!!

  • sleep(1); 休眠1秒
  • 打开读通道——> open("FIFO",O_RDONLY);
  • 打开写通道——> open("FIFO",O_WRONLY);
  • 开始写——>write(fd,"heool0penEuler",1);

答案如下:

 if(pid==0){// ============================= begin =========================/*子进程打开读管道,随后关闭管道*/int fd;fd = open("FIFO",O_RDONLY);  /*rd->only 写*//*关闭*/close(fd);}else{/*父进程打开写通道,休眠1秒,尝试写入*/int fd;fd = open("FIFO",O_WRONLY);  /*wr->only 写*/int ret;sleep(1); /*休眠1秒*//*写入*/ret = write(fd,"heool0penEuler",1);// ============================= end =========================}

六、 Linux vi/vim编辑器(难度:简单

注意这类题目在操作之前需要初始化任务环境

(1)第1关:vi/vim基本用法
(2)第2关:vi/vim工作模式切换
  • wq :保存并退出
  • i:插入
(3)第3关:vi/vim命令模式
  • dd:删除
  • yy:复制
  • p:粘贴
(4)第4关:vi/vim底线命令模式(重点
  • 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2。 :1,$s/word1/word2/g
  • 将文件第2-5行内容另存为oldFileCpy.txt文件:2,5 w oldFileCpy.txt

七、读文件系统函数(难度:简单

(1)第1关:读文件系统函数

(此题注意:知道read()函数是啥就行了。其次知道其返回值和其函数的参数)

  • 函数原型:read(int fd, void *buf, size_t count);
  • fd:看上文(读文件的地址)
  • *buf:字符数组缓冲区的位置
  • 最后这个size_t count:就是读到的全部字符的个数——> sizeof(buffer)-1
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#define rwmode 0
int main()
{int fd;char buffer[1024];int n;fd = open("/data/workspace/myshixun/case1/testFIle", rwmode);if (fd < 0){printf("Open file error!\n");exit(1);}elseprintf("open testFIle ok!\n");//-------------begin----------------------  //请使用read函数将其读入buffer中n = read(fd,buffer,sizeof(buffer)-1);//--------------end----------------------  buffer[n] = '\0';printf("%s\n", buffer);close(fd);return 0;
}

八、写文件系统函数(难度:中等)

(1)第1关:写文件系统函数

(这题其实就是一个综合。先用read()读函数,再用write()写函数

  • 函数原型:ssize_t write(int fd, const void *buf, size_t count);
  • 读的文件的地址题目也给出:int resource_fd

  • char buffer[FILESIZE]:字符数组

  • #define FILESIZE 1024 (该字符数组最大容量,也是题目要求读取的量)
  • 所以:(read(resource_fd,buffer,FILESIZE ))>0,因为读到了就要返回得到的个数。
  • char buffer[FILESIZE], *p; p = buffer; :要写入的字符数组信息地址在p

  • 写的目的文件地址题目也给出了:int  destination_fd

  • 具体要写的字符个数(前面被赋值):readbytes = read(resource_fd,buffer,FILESIZE)

  • 所以:(writebytes = write(destination_fd,p,readbytes))>0,因为写到了就要返回个数

综合解答:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define resource_mode 0
#define destination_mode 0774
#define FILESIZE 1024int main(int argc, char *argv[])
{int resource_fd, destination_fd;char buffer[FILESIZE], *p;int readbytes, writebytes;if (argc != 3){printf("Usage:copy from resource file to destination file\n %s src_file dest_file\n", argv[0]);exit(0);}if ((resource_fd = open(argv[1], resource_mode)) == -1){perror("Can't open source file");exit(0);}if ((destination_fd = creat(argv[2], destination_mode)) == -1){perror("Can't create destination file");exit(0);}// ======================= begin =======================================// 请使用read函数读取前1024字节的内容读到缓冲区buffer中while ((readbytes = read(resource_fd,buffer,FILESIZE))>0)// ========================== end ======================================={p = buffer;if ((readbytes == -1) && (errno != EINTR))break;else if (readbytes > 0){// ======================= begin =======================================// 请使用write函数读取到的前1024字节的内容写到目的文件中while ((writebytes = write(destination_fd,p,readbytes))>0)// ========================== end ======================================={if ((writebytes == -1) && (errno != EINTR))break;else if (writebytes == readbytes)break;else if (writebytes > 0){p += writebytes;readbytes -= writebytes;}}if (writebytes == -1)break;}}close(resource_fd);close(destination_fd);return 0;
}

 九、进程基础操作(难度:简单

(1)第1关:进程基础操作考察

(这一关没啥好说的,难度很简单)

  • 了解fork()函数即可
  • 注意空格的输出(父、子进程都一样):printf("bye! "); 
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{/*请开始填写*/pid_t pid =fork();if(pid==0){printf("bye! ");}else if(pid>0){printf("bye! ");}return 0;
}

相关文章:

os实训课程模拟考试(大题复习)

目录 一、Linux操作系统 &#xff08;1&#xff09;第1关&#xff1a;Linux初体验 &#xff08;2&#xff09;第2关&#xff1a;Linux常用命令 &#xff08;3&#xff09;第3关&#xff1a;Linux 查询命令帮助语句 二、Linux之进程管理—&#xff08;重点&#xff09; &…...

QT/QML国际化:中英文界面切换显示(cmake方式使用)

目录 前言 实现步骤 1. 准备翻译文件 2. 翻译字符串 3.设置应用程序语言 cmake 构建方式 示例代码 总结 1. 使用 file(GLOB ...) 2. 引入其他资源文件 再次生成翻译文件 5. 手动更新和生成.qm文件 其他资源 前言 在当今全球化的软件开发环境中&#xff0c;应用程…...

设计模式在Java项目中的实际应用

设计模式在Java项目中的实际应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 设计模式是软件开发中重要的思想工具&#xff0c;它提供了解决特定问题…...

js制作随机四位数验证码图片

<div class"lable lable2"><div class"l"><span>*</span>验证码</div><div class"r"><input type"number" name"vercode" placeholder"请输入验证码"></div>&l…...

[开源软件] 支持链接汇总

“Common rules: 1- If the repo is on github, the support/bug link is also on the github with issues”" label; 2- Could ask questions by email list;" 3rd party software support link Note gcc https://gcc.gnu.org openssh https://bugzilla.mindrot.o…...

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…...

Iot解决方案开发的体系结构模式和技术

前言 Foreword 计算机技术起源于20世纪40年代&#xff0c;最初专注于数学问题的基本原理&#xff1b;到了60年代和70年代&#xff0c;它以符号系统为中心&#xff0c;该领域首先开始面临复杂性问题&#xff1b;到80年代&#xff0c;随着个人计算的兴起和人机交互的问题&#x…...

02.C1W1.Sentiment Analysis with Logistic Regression

目录 Supervised ML and Sentiment AnalysisSupervised ML (training)Sentiment analysis Vocabulary and Feature ExtractionVocabularyFeature extractionSparse representations and some of their issues Negative and Positive FrequenciesFeature extraction with freque…...

Stable Diffusion秋叶AnimateDiff与TemporalKit插件冲突解决

文章目录 Stable Diffusion秋叶AnimateDiff与TemporalKit插件冲突解决描述错误描述&#xff1a;找不到模块imageio.v3解决&#xff1a;参考地址 其他文章推荐&#xff1a;专栏 &#xff1a; 人工智能基础知识点专栏&#xff1a;大语言模型LLM Stable Diffusion秋叶AnimateDiff与…...

PCL 渐进形态过滤器实现地面分割

点云地面分割 一、代码实现二、结果示例🙋 概述 渐进形态过滤器:采用先腐蚀后膨胀的运算过程,可以有效滤除场景中的建筑物、植被、车辆、行人以及交通附属设施,保留道路路面及路缘石点云。 一、代码实现 #include <iostream> #include <pcl/io/pcd_io.h> #in…...

第十四届蓝桥杯省赛C++B组E题【接龙数列】题解(AC)

需求分析 题目要求最少删掉多少个数后&#xff0c;使得数列变为接龙数列。 相当于题目要求求出数组中的最长接龙子序列。 题目分析 对于一个数能不能放到接龙数列中&#xff0c;只关系到这个数的第一位和最后一位&#xff0c;所以我们可以先对数组进行预处理&#xff0c;将…...

Ubuntu 20.04.4 LTS 离线安装docker 与docker-compose

Ubuntu 20.04.4 LTS 离线安装docker 与docker-compose 要在Ubuntu 20.04.4 LTS上离线安装Docker和Docker Compose&#xff0c;你需要首先从有网络的环境下载Docker和Docker Compose的安装包&#xff0c;然后将它们传输到离线的服务器上进行安装。 在有网络的环境中&#xff1a…...

vue3+ts 写echarts 中国地图

需要引入二次封装的echarts和在ts文件写的option <template><div class"contentPage"><myEcharts :options"chartOptions" class"myEcharts" id"myEchartsMapId" ref"mapEcharts" /></di…...

【设计模式】【行为型模式】【责任链模式】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…...

超越所有SOTA达11%!媲美全监督方法 | UC伯克利开源UnSAM

文章链接&#xff1a;https://arxiv.org/pdf/2406.20081 github链接&#xff1a;https://github.com/frank-xwang/UnSAM SAM 代表了计算机视觉领域&#xff0c;特别是图像分割领域的重大进步。对于需要详细分析和理解复杂视觉场景(如自动驾驶、医学成像和环境监控)的应用特别有…...

享元模式(设计模式)

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过共享细粒度对象来减少内存使用&#xff0c;从而提高性能。在享元模式中&#xff0c;多个对象可以共享相同的状态以减少内存消耗&#xff0c;特别适合用于大量相似对象的场景。 享元模…...

【机器学习】大模型训练的深入探讨——Fine-tuning技术阐述与Dify平台介绍

目录 引言 Fine-tuning技术的原理阐 预训练模型 迁移学习 模型初始化 模型微调 超参数调整 任务设计 数学模型公式 Dify平台介绍 Dify部署 创建AI 接入大模型api 选择知识库 个人主页链接&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 Fine-tuning技术允许用户根…...

【Linux从入门到放弃】探究进程如何退出以进程等待的前因后果

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 进…...

QT5 static_cast实现显示类型转换

QT5 static_cast实现显示类型转换&#xff0c;解决信号重载情况...

【ES】--Elasticsearch的翻页详解

目录 一、前言二、from+size浅分页1、from+size导致深度分页问题三、scroll深分页1、scroll原理2、scroll可以返回总计数量四、search_after深分页1、search_after避免深度分页问题一、前言 ES的分页常见的主要有三种方式:from+size浅分页、scroll深分页、search_after分页。…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...