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;
}

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

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

相关文章

青岛网站建设一般多少钱

青岛网站建设的价格一般会根据网站的规模、功能、设计风格等因素来定&#xff0c;价格会存在着一定的差异。一般来说&#xff0c;一个简单的网站建设可能在数千元到一万元之间&#xff0c;而一个复杂的大型网站建设可能会需要数万元到数十万元不等。所以在选择网站建设服务时&a…

大模型RAG、ROG、RCG概念科普

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

LeetCode.76 最小覆盖子串

问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字…

[Cloud Networking] BGP

1. AS (Autonomous System) 由于互联网规模庞大&#xff0c;所以网络会被分为许多 自治系统&#xff08;AS-Autonomous system&#xff09;。 所属类型ASN名称IPv4 数量IPv6数量运营商ISPAS3356LEVEL3 - Level 3 Parent, LLC, US29,798,83273,301,954,048互联网企业AS15169GO…

java接口自动化测试,怎样可以快速入门?

从0到1&#xff0c;快速入门Java接口自动化测试 Java接口自动化测试是一种自动化测试的方式&#xff0c;通过模拟用户发送HTTP请求并验证返回结果&#xff0c;来测试接口的正确性。它可以大大提高测试效率和覆盖率&#xff0c;减少人工测试的工作量。本文将从零开始&#xff0…

SaaS系统中的数据库设计探讨

在SaaS&#xff08;Software as a Service&#xff09;系统中&#xff0c;数据库设计是确保数据安全性、隔离性和高效访问的重要环节。SaaS应用通常需要处理多个租户的数据&#xff0c;每个租户可能有不同的数据需求和使用模式。因此&#xff0c;设计一个高效且安全的数据库架构…

【NodeJs】入门

目录 一、前导 二、 url模块 三、path模块 四、buffer模块 五、fs模块 六、stream流模块 七、os模块 八、crypto模块 九、util模块 十、http模块 nodejs官网 Node.js — 在任何地方运行 JavaScript nmp是Node.js包管理器&#xff0c;用来安装各种库、框架和工具&…

ForkJoin

线程数超过CPU核心数是没有任何意义的【因为要使用CPU密集型运算】 Fork/Join&#xff1a;线程池的实现&#xff0c;体现是分治思想&#xff0c;适用于能够进行任务拆分的 CPU 密集型运算&#xff0c;用于并行计算 任务拆分&#xff1a;将一个大任务拆分为算法上相同的小任务…

【鸿蒙】开发中设置热更新

鸿蒙系统&#xff08;HarmonyOS&#xff09;的热更新和热加载设置主要涉及开发环境和系统更新两个方面。以下是关于鸿蒙系统热更设置的详细步骤和相关信息&#xff1a; 开发环境热更新和热加载设置 在鸿蒙系统的开发环境中&#xff0c;实现热更新和热加载通常用于快速迭代和测…

pdf怎么转换成jpg,本地转换还是在线转换?

PDF&#xff08;Portable Document Format&#xff09;和JPG&#xff08;Joint Photographic Experts Group&#xff09;这两种文件格式在我们的日常生活和工作中扮演着举足轻重的角色。PDF因其跨平台、保持原样性强的特点&#xff0c;被广泛应用于文件传输和存储&#xff1b;而…

iCloud邮件全攻略:设置与使用终极指南

标题&#xff1a;iCloud邮件全攻略&#xff1a;设置与使用终极指南 摘要 iCloud邮件是Apple提供的一项邮件服务&#xff0c;允许用户在所有Apple设备上访问自己的邮件。本文将详细介绍如何在各种设备和邮件客户端上设置和使用iCloud邮件账户&#xff0c;确保用户能够充分利用…

百日筑基第六天-了解一下Dubbo

百日筑基第六天-了解一下Dubbo Dubbo 是一款高性能、轻量级的开源 WEB 和 RPC 框架。 Dubbo 提供了六大核心能力&#xff1a; 面向接口代理的高性能 RPC 调用。智能容错和负载均衡。服务自动注册和发现。高度可扩展能力。运行期流量调度。可视化的服务治理与运维。 简单来说…

代码随想三刷动态规划篇2

代码随想三刷动态规划篇2 62. 不同路径题目代码63. 不同路径 II题目代码343. 整数拆分题目代码96. 不同的二叉搜索树题目代码62. 不同路径 题目 链接 代码 class Solution {public int uniquePaths(int m, int n) {int[][]dp =</

技术周总结 2024.06.24~06.30(Python并发执行shell并发执行)

文章目录 一、 06.26 周三1.1&#xff09;问题01&#xff1a;怎么在mysql的命令行中查询出来 python能使用的元祖结果集1.2&#xff09;问题02&#xff1a;python中 set()是什么&#xff0c;怎么使用 二、06.27 周四2.1&#xff09;问题01&#xff1a;shell 并发执行2.2&#x…

从0到1搭建Java开发环境(内涵超详细教程、软件、提供网盘链接直接一步到位!!!!)

软件部分 需要的软件为下面两个&#xff1a; IDEANavicat 需要的可以自行拿&#xff08;安装教程和软件&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1y3RoMt0ZapyJsj3P0DPaVA?pwdxr4p 提取码&#xff1a;xr4p 环境部分 需要的环境为以下几个&…

springboot+vue+mybatis奶茶管理系统+PPT+论文+讲解+售后

由于科学技术的快速发展&#xff0c;人们的生活也与信息时代的发展相关。同时&#xff0c;随着市场化和经济化的发展&#xff0c;国内很多行业已经意识到了这一点&#xff0c;为了提升行业的竞争力&#xff0c;就应当率先把握机会。于是在互联网的默化潜移影响下&#xff0c;餐…

IntelliJ IDEA新建gradle项目

在 IntelliJ IDEA 中新建一个 Gradle 项目非常简单,以下是详细的步骤指南: 步骤 1: 打开 IntelliJ IDEA 并创建新项目 启动 IntelliJ IDEA:打开 IntelliJ IDEA 应用程序。 创建新项目: 在欢迎屏幕中,点击 New Project。如果已经打开了一个项目,可以通过 File > New &…

数据科学中的瑞士军刀:Scikit-learn中的交叉验证详解

标题&#xff1a;数据科学中的瑞士军刀&#xff1a;Scikit-learn中的交叉验证详解 交叉验证是机器学习中用于评估模型泛化能力的重要技术。Scikit-learn&#xff0c;作为Python中一个广泛使用的机器学习库&#xff0c;提供了一套强大的交叉验证工具。本文将深入探讨Scikit-lea…

【Qt+opencv】编译、配置opencv

文章目录 前言下载opencv编译opencvmingw版本 总结 前言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;它包含了超过2500个优化的算法。这些算法可以用来检测和识别面部&#xff0c;识别对象&#x…

01.音视频小白系统入门(新专栏)

目录 一、基础知识 二、音频 三、视频 四、流媒体服务器 五、收获 音视频技术在远程办公、在线教育、远程医疗等领域的应用广泛。 学习音视频技术有助于提升职业竞争力&#xff0c;满足市场需求。 掌握音视频基础知识对未来发展至关重要&#xff0c;基础不牢会导致后续学习…