NUAA操作系统OS实验及上机考试记录
Posted ChangYan.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NUAA操作系统OS实验及上机考试记录相关的知识,希望对你有一定的参考价值。
记录nuaa操作系统实验题目
将代码分享出来是为了学弟学妹更好的学习复习,并不是为copy提供便利。里边包含了平时的job及近几年的考试题,我已将代码上传至github:
https://github.com/changyan-maker/NUAA_OS
最后参加机考我拿了90+,来源于平时认真完成job以及考前认真刷题准备,所以平时不要copy代码投机取巧哦,要理解其中的思路,在机考的过程中才能游刃有余!
文章目录
exam
往年考试题的题目和代码已上传至github,建议考前多刷两遍,
https://github.com/changyan-maker/NUAA_OS
毕竟考试相对综合,个人觉得考前时间充裕的话,先刷一遍作业的job,最后再刷往年考试题会很有感觉。我们19级也就是2022年考的特别难,基本没有几个同学完全运行出正确结果,老师最后都是按照过程给分,这里将题目分享出来只是为了长长见识,毕竟在考试前我也没太见过这种题,考试过程中基本全靠临场发挥。不过前几年的题目还是很简单的,听说拿满分的人也有,所以对于2018、2019、2021年的题目,学弟学妹一定要自己写出来,拿下那些题型!
job3
1. myecho.c
myecho.c的功能与系统echo程序相同
接受命令行参数,并将参数打印出来,例子如下:
$ ./myecho x
x
$ ./myecho a b c
a b c
#include<stdio.h>
int main(int argc, char *argv[])
int i;
printf("argc=%d\\n",argc);
for(i=1;i<argc;i++)
printf("%s ",argv[i]);
printf("\\n");
return 0;
2. mycat.c
mycat.c的功能与系统cat程序相同
mycat将指定的文件内容输出到屏幕,例子如下:
要求使用系统调用open/read/write/close实现
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…
$ ./mycat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc, char *argv[])
int fd;
mode_t mode = 0777;
fd = open(argv[1],O_RDONLY,mode);
char ch;
int count = read(fd, &ch, sizeof(ch));
while(count)
printf("%c", ch);
count = read(fd, &ch, sizeof(ch));
close(fd);
return 0;
3. mycp.c
mycp.c的功能与系统cp程序相同
将源文件复制到目标文件,例子如下:
要求使用系统调用open/read/write/close实现
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…
$ ./mycp /etc/passwd passwd.bak
$ cat passwd.bak
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
…
#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc, char *argv[])
mode_t mode = 0777;
int fd1 = open(argv[1], O_RDONLY, mode);
int fd2 = creat(argv[2],mode);
char ch;
int count = read(fd1, &ch, sizeof(ch));
int count2;
while(count)
count2 = write(fd2, &ch, sizeof(ch));
count = read(fd1, &ch, sizeof(ch));
close(fd1);
close(fd2);
return 0;
4. mysys.c
mysys的功能与系统函数system相同,要求用进程管理相关系统调用自己实现一遍
使用fork/exec/wait系统调用实现mysys
不能通过调用系统函数system实现mysys
测试程序
#include <stdio.h>
void mysys(char *command)
实现该函数,该函数执行一条命令,并等待该命令执行结束
int main()
printf(“--------------------------------------------------\\n”);
mysys(“echo HELLO WORLD”);
printf(“--------------------------------------------------\\n”);
mysys(“ls /”);
printf(“--------------------------------------------------\\n”);
return 0;
测试程序的输出结果
--------------------------------------------------
HELLO WORLD
--------------------------------------------------
bin core home lib mnt root snap tmp vmlinuz
boot dev initrd.img lost+found opt run srv usr vmlinuz.old
cdrom etc initrd.img.old media proc sbin sys var
--------------------------------------------------
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>
void mysys(char *command)
int pid;
pid = fork();
if(pid==0)
int i=0;
char a[5][20];
int num = 0;
int j=0;
while(command[i]!='\\0')
if(command[i]!=' ')
a[num][j++] = command[i];
else
a[num++][j++] = '\\0';
j=0;
i++;
a[num][j++] = '\\0';
int error;
char *argv[5];
for(i=0;i<=num;i++)
argv[i] = (char *)malloc(sizeof(char)*20);
strcpy(argv[i],a[i]);
argv[i] = NULL;
error = execvp(argv[0],argv);
if(error<0)
perror("execv");
wait(NULL);
int main()
printf("--------------------------------------------------\\n");
mysys("echo HELLO WORLD");
printf("--------------------------------------------------\\n");
mysys("ls /");
printf("--------------------------------------------------\\n");
return 0;
5. sh1.c
该程序读取用户输入的命令,调用函数mysys(上一个作业)执行用户的命令,示例如下
# 编译sh1.c
$ cc -o sh1 sh1.c
# 执行sh1
$ ./sh
# sh1打印提示符>,同时读取用户输入的命令echo,并执行输出结果
> echo a b c
a b c
# sh1打印提示符>,同时读取用户输入的命令cat,并执行输出结果
> cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
实现内置命令cd、pwd、exit
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>
int main()
while(1)
printf("%s","> ");
char str[105];
fgets(str,100,stdin);
int i=0;
while(str[i]!='\\n')
i++;
str[i] = '\\0';
i=0;
char a[5][20];
int num = 0;
int j=0;
while(str[i]!='\\0')
if(str[i]!=' ')
a[num][j++] = str[i];
else
a[num++][j++] = '\\0';
j=0;
i++;
a[num][j++] = '\\0';
int error;
char *argv[5];
for(i=0;i<=num;i++)
argv[i] = (char *)malloc(sizeof(char)*20);
strcpy(argv[i],a[i]);
argv[i] = NULL;
if(strcmp(argv[0],"cd")==0)
chdir(argv[1]);
else if(strcmp(argv[0],"exit")==0)
exit(0);
else if(strcmp(argv[0],"pwd")==0)
char work_dir[80];
getcwd(work_dir,sizeof(work_dir));
printf("%s\\n",work_dir);
else
int pid;
pid = fork();
if(pid==0)
error = execvp(argv[0],argv);
if(error<0)
perror("execv");
wait(NULL);
return 0;
job4
1. myls.c
myls.c的功能与系统ls程序相同
opendir readdir closedir
在命令行中输入 man opendir 获取帮助
列出指定目录下的文件,例子如下:
$ ./myls job4/test
a
b
c
列出当前目录下的文件,例子如下:
$ cd job4/test
$ ./myls
a
b
c
#include<stdio.h>
#include<dirent.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char *argv[])
DIR *dir;
if(argc >= 2)
dir = opendir(argv[1]);
else
dir = opendir(getcwd(NULL,0));
while(1)
struct dirent *de = readdir(dir);
if(de == NULL) break;
if(strcmp(de->d_name,"..")!=0 && strcmp(de->d_name,".")!=0)
printf("%s\\n",de->d_name);
closedir(dir);
return 0;
2. mytree.c
mytree.c的功能与系统tree程序相同
使用空格作为缩进,表示层次
$ ./mytree job4/test
test
a
b
x
y
z
c
#include<stdio.h>
#include<dirent.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
void mytree(int k_num, char *work_dir)
char k[80] = "";
for(int i=0;i<k_num;i++)
strcat(k," ");
DIR *dir = opendir(work_dir);
if(dir == NULL)
perror("opendir");
exit(0);
while(1)
struct dirent *de = readdir(dir);
if(de == NULL) break;
if(strcmp(de->d_name,"..")!=0 && strcmp(de->d_name,".")!=0)
printf("%s",k);
printf("%s\\n", de->d_name);
if(de->d_type == DT_DIR)
strcat(work_dir,"/");
strcat(work_dir,de->d_name);
mytree(k_num+1,work_dir);
closedir(dir);
int main(int argc, char *argv[])
if(argc >= 2)
printf("%s\\n",argv[1]);
mytree(1, argv[1]);
else
printf("%s\\n",getcwd(NULL,0));
mytree(1, getcwd(NULL,0));
return 0;
job5
1.sh2.c
实现shell程序,要求在第1版的基础上,增加文件重定向功能
重定向输入
重定向输出
重定向追加
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
void child(char *argv[])
int num=0;
int i = 0;
while(argv[i])
i++;
num++;
char str1[80];
char str2[80];
if(argv[1]!=NULL && argv[1][0] == '<')
memcpy(str1, argv[1]+1,sizeof(argv[1]-1));
int fd1 = open(str1,O_CREAT|O_RDWR,0666);
dup2(fd1,0); //input from fd1;
close(fd1);
argv[1] = NULL; //for cat
if(argv[2]!= NULL && argv[2][0] == '>')
int fd2;
if(argv[2][1]=='>') // >>
memcpy(str2,argv[2]+2,sizeof(argv[2]-2));
fd2 = open(str2,O_CREAT|O_RDWR|O_APPEND,0666);
else // >
memcpy(str2,argv[2]+1,sizeof(argv[2]-1));
fd2 = open(str2,O_CREAT|O_RDWR|O_TRUNC,0666);
dup2(fd2,1); //output into fd2;
<老男孩教育运维班100台规模集群存储系统搭建及数据实时备份上机实战
老男孩教育运维班0基础起步上机实战系列项目
老男孩教育运维班100台规模集群存储系统搭建及数据实时备份上机实战
项目要求:
1、全体学员上机实践考试,完成后由排长或班长、或助教打分。
2、时间:90分钟,抄袭0分。
(一)上机服务器业务及IP主机名规划
已知4台服务器主机名主机对应信息见下表:
服务器说明
外网IP
内网IP
主机名
apache web服务器
10.0.0.7/24
172.16.1.7/24
web02
nginx web服务器
10.0.0.8/24
172.16.1.8/24
web01
NFS存储服务器
10.0.0.31/24
172.16.1.31/24
nfs01
rsync备份服务器
10.0.0.41/24
172.16.1.41/24
backup
整个项目的逻辑图如下:
(二)搭建网站集群后端NFS共享存储搭建及优化解决方案
1、配置NFS服务:
要求:
1)在NFS服务端nfs01上共享/data目录,允许从NFS客户端web01、web02上分别挂载共享目录。
2)当在NFS客户端web01上的挂载点/data写入数据时,在NFS客户端web02上也可以删除或修改。
3)问答题:如何优化NFS服务?
本项目的整个备份逻辑结构见集群架构图中数字1和2部分
(三)搭建网站集群全网备份服务器backup
要求:在backup服务器上配置Rsync数据同步服务,从nfs01服务器上可以推送数据到backup服务器的/backup目录。本项目的整个备份逻辑结构见集群架构图中数字3部分
具体要求:backup服务器的备份目录必须为/backup。
(四)解决网站集群后端NFS共享存储单点实现实时数据同步
1、实时数据同步要求:
当用户通过任意台web服务器将数据写入到NFS服务器nfs01时,同时复制到备份服务器backup。
2、本项目的整个备份逻辑结构见集群架构图中数字3和4部分
(五)评分标准及评分人
评分标准见表:
ID
分数
项目
1
40分
完成NFS共享存储搭建及优化解决方案
2
20分
完成搭建网站集群全网备份服务器backup
3
30分
完成NFS实时数据备份
4
10分
完成整体测试机评分人按态度自由给分
评分人:各排排长或连长5人组(王志伟、鲍明、廖海林、夏富国、陈荣华)或助教。
企业运维岗三项核心职责:
1、企业数据不丢
备份策略又分为异步备份和实时备份,本文主要解决外部用户更改的数据同步备份问题,数据库数据备份见后面课程。。
2、7*24服务能力
3、用户访问体验好
有关几百到上千台全网所有服务器异步备份和实时备份思想策略,可以关注老男孩公众号,近期会有阐述文章。
本文出自 “老男孩linux培训” 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/1857537
以上是关于NUAA操作系统OS实验及上机考试记录的主要内容,如果未能解决你的问题,请参考以下文章
20170721L08-02-02老男孩Linux运维实战培训初级第八节课课前上机实战考试讲解
华为 1+X《网络系统建设与运维(中级)》认证 模拟实验上机试题及其答案全解析