




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录前 言.2实验一 UNIX/Linux操作系统的实际使用.3实验二 命令解释程序.10实验三 进程管理.20实验四 存储管理.28实验五 简单的数据库管理系统设计.35实验六 输入/输出管理.60综合实验 65附录 75 参考书目 83前 言操作系统是计算机科学与技术及相关专业的一门重要的专业课,是一门实践性很强的技术课程。掌握操作系统原理、熟悉操作系统的使用是各层次计算机软硬件开发人员必不可少的基本技能。然而,困扰操作系统教学的问题是讲授理论原理比较容易,而如何指导学生进行实践则相对较难。其结果导致学生不能深刻地理解操作系统的本质,因而也不能在实际中应用所学的操作系统理论知识及操作系统所提供的功能来解决实际问题。一般来说,学习操作系统分为以下几个层次:1 学习并掌握操作系统的基本概念及原理,了解操作系统的实现机制。2 掌握常用操作系统的使用、操作和维护,成为合格的系统管理员。目前最常用的操作系统主要有UNIX、Linux、Windows等等。3 掌握操作系统编程技术。4 通过分析操作系统源代码,掌握修改、编写操作系统的能力。开放源代码的操作系统Linux的出现为我们提供了机遇。 在操作系统实践教学上,人们作了长期的探索。美国人ASTanenbaum是位先驱,由他编写的教学操作系统Minix在很长一段时间里较好地解决了这一问题。然而,随着计算机系统的体系结构的变化,元器件以及相应软件的飞速发展,早年开发出的Minix在很多方面已经不能适应今天的操作系统教学的需要了。 在当今计算机科学相对发达的国度,人们也已认识到这方面的问题,他们开发出适合他们自己教学用的操作系统0SP、BACI、NACHOS、TOYOS等,其中OSP、BACI是基于裸机的操作实验系统,而NACHOS、TOYOS是基于模拟器的操作实验系统。但是,一个全新的、支持基于Intel x86计算机的操作系统教学实验系统至今仍很少。国内这方面的研究相对滞后,就已有的几本关于操作系统实验的书籍来看,一个突出的问题便是教学专用实验系统比较少。操作系统本身的构造十分复杂,如何在有效的时间内,使学生既能了解其实现原理又能对原理部分进行有效的实践,是操作系统教学一直在探索的内容。本实验课程以Linux操作系统为主要平台,从基本原理出发,提供了UNIX/Linux操作系统的使用、命令解释程序、进程管理、存储管理、简单的数据库管理系统的设计、输入/输出管理等6个实验,希望通过这些实验,使学生能对操作系统的基本原理有更深入的了解,为将来从事操作系统方面的研究工作打下一定的基础。实验一 UNIX/Linux操作系统的实际使用一实验目的通过本实验熟悉UNIX/Linux操作系统常用命令的操作和使用。二实验内容1.进入和退出UNIX/Linux操作系统;2.常用命令的使用:cat,cd,chmod,cp,df,find,grep,id,ln,ls等;3.全屏幕编辑器vi的熟悉使用。三验证实验1实验要求1)熟悉开机后登录进入系统和退出系统; 2)常用命令的操作使用; 3)全屏幕编辑器vi的熟悉使用; 4)为以后的上机实验作好准备。2实验步骤 1)进入和退出UNIX/Linux操作系统 (1)开机后,执行运行(可通过telnet) (2)进入 login: username password: XXXXX $ (3)退出$logout或exit 2)常用命令 (1)cal-j-y月年 选项 说明 -j 显示西洋旧历(计算机系统日历表示) -y 显示当年日历 月 用112表示月份。默认是本月年 可以是19 999(4位数),默认是本年。 (2)cat选项文件列表 用于显示文件或连接文件。例如: cat ac (将文件ac输出到屏幕上) cat ac bccc (将文件bc加到ac后并建立新文件cc) (3)cd目录名改变当前工作目录。 (4)chmod选项模式文件列表 改变文件模式。例如: chmod 777 ac (使文件ac在各个级别拥有所有权限)注:UNIX/Linux有3个安全级:所有者级、组访问级和其他用户级。在这3级中,各有3种权限:读、写和执行。chmod o-wr,g-wr ac (对组级和其他用户级不拥有写权和读权) (5)clear清除屏幕。 (6)compress选项文件名 项目 说明 -c 将压缩或解压缩的操作结果写到标准输出,不改变文件 -C 防止文件细分为块,这产生一个输出文件,旧的压缩版本也可以读取 -d 解压缩文件 -f 若输出文件存在,则覆盖,不用提示确认。同时,把所有文件(包括没压缩的)变为Z文件 -v 在每个文件压缩完后,打印给出输入文件被压缩百分数信息 文件名 要压缩的文件名称。例如: compress a (压缩文件a,并改名为aZ) compress -v*homeusrusrl (压缩目录homeusrusrl中所有文件,在每个文件压缩后打印压缩信息)compress -d aZ(将压缩文件释放回原状态) (7)cp选项 源文件 目标文件 cp选项源文件组 目标目录 拷贝文件。例如: cp a b (将文件a拷贝到文件名为b的文件)cp -v bet*dd (拷贝所有以bet为开头的文件到目录dd) (8)date显示系统日期和时间。 (9)df 报告磁盘剩余空问数(单位:块。每块512字节)。 (10)du选项目录或文件名称 显示指定目录或文件使用的空间总数。例如:du s usrbin (报告目录usrbin使用的总空间,以块-512B为单位) (11)echo-n-e串 本命令把传给它的参数在标准输出显示。 项目 说明 -n 通常,echo使所有输出都由新行开始,本选项可制止这一点 -e 使串中的如下字符序列的解释成为可能: a 警告(响铃) b 退格 c 在行尾,不新起行 f 换页 n 换行 r 回车 t 制表符 v 垂直制表符 反斜杠mm 字符的八进制ASCII码是mm串希望输出的字符串 例如: echo Hello(在标准输出打印Hello) echo -e“enter Y or Nc” (提示用户用Y或N回答而不开始新的一行) echo -e“Can you hear this07?”(07代表八进制数,这里八进制数用于使终端振铃) (12)file选项文件列表 确认文件是否是可执行文件、文本文件和数据文件等。例如: file homeaa(检测文件homeaa,并报告文件类型) (13)find目录列表匹配标准 项目 说明 目录列表 希望查询的文件或文件集的目录列表,目录间用空格分隔 匹配标准 希望查询的文件的匹配标准或说明 - name文件 告诉find要找什么文件 - type x 此类型为x的文件,x代表:c(字符特殊),b(块特殊),d(目录), p(有名管道),|(符号连接),s(套接文件)或f(一般文件) - size n 匹配所有修改时间比file文件更新的文件 例如:find -name“letter*” -print(查找以letter为开头的文件,并打印) (14)grep串文件列表在文件中查找模式,当找到时报告。例如:grep“hHello”aa (在文件aa中查找hello或Hello)(15)ln源文件 目标文件在两个文件间建立连接。(16)logname报告用户登录到系统上的名字。(17)ls选项文件列表列出文件系统中的文件。 项目 说明 -a 显示所有文件,包括当前目录和父目录 -c 按列输出,纵向排列 -x 按列输出,横向排列 -l 给出长表。长表显示文件的详细内容,如文件类型、权限、连接或目录计数、所有者、组、字节大小、文件的最近修改时间和文件名。文件类型有: - 常规文件 d 目录 b 块特殊设备(例如磁盘) c 字符特殊设备(例如终端) s 信号灯 m 共享存储器 p 有名管道权限有3个串,每串有3个字节,各串分别代表所有者、组和其他的权限,权限如下: r 读权 w 写权 x 执行权 -t 按最后修改的时间排序,和-l标志一起使用 -u 按最后访问的时间排序,和-l标志一起使用 文件列表 用ls要处理的文件列表例如:ls -ltusrspoolaa(给出长表,按最后修改的时间排序) (18)mkdir-p目录名目录 在文件系统中建立新目录。 项目 说明 -p目录名 建立所有不存在父目录的目录 目录 要建立的新目录 例如: mkdir letters(建立letters目录) mkdir -p lettersa lettersb(建立目录lettersa和lettersb) (19)more选项文件名 按页显示文件。 项目 说明 -n n是整数,用于建立大小为n行长的窗口,窗口大小是在屏幕上显示多少行 -c 用more给文件翻页时通过从头清除一行,然后再在最后写下一行的办法写入。通常,more清除屏幕,再写一行 文件名 希望用more显示的文件列表 例如: more letter (显示名为letter的文件) ls -ldev| more(按页显示dev目录下的文件) (20)mv-f-I文件1 文件2 mv-f-I目录1 目录2 mv-f-I文件列表 目录 给文件改名,移动文件到一个新的目录或给目录改名。 项目 说明 -f 使mv执行移动而不作显示 -I 交互模式,在覆盖写文件前提示 文件1 源文件名 文件2 目标文件名(新文件名) 目录1 源目录名 目录2 目标目录名(新目录名) 文件列表 用空格分开的文件名列表。该选项用于保持文件名移到一个新的目录 目录 目标目录 例如:mv letters letter (将文件letters改名为letter)(21)passwd名字 维护用户口令。显示或修改用户口令(只有系统管理员可以删除用户口令)。(22)pwd 显示当前工作的目录路径。(23)rm选项文件列表 从文件系统中删除文件及整个目录。 项目 说明 文件列表 希望删除用空格分开的文件,可以包括目录名 -r 删除文件列表中指定的目录-f 指定强行删除模式(24)rmdir -p目录表删除目录。 项目 说明 -p 若指定删除目录的父目录为空,则父目录也被删除 目录表 用空格分开的目录表,要删除的目录必须为空目录(25)vi文件名vi是全屏幕编辑器。vi有两种工作状态:命令模式和输入模式(注意大小写!)。 a,i,o 进入输入模式 回到执行命令状态(工作途中,可作为取消命令或进入命令状态 的控制) 退出vi: :w 文件名(写到指定文件名的文件中。如无文件名,将编辑缓冲区 内容写到磁盘) :q (或ZZ)(退出vi,不写入磁盘) :wq (写文件到磁盘,然后退出) :q! (退出不存盘)取消上次编辑命令移动光标: k 向上 j 向下 h 向左 l 向右 回第一行 到末行 到中间 到文件最后 到文件第n行 到行尾 到行首插人命令: a 在光标后插入 i 在光标前插入 o 在光标下一行插入 O 在光标上一行插入删除命令: 删除光标所在的字符 删除光标前面的字符 删字 删光标处到行尾 删除一行替换命令: 将光标所在的字符改为后键入的字符 将原来的字符一个一个地用后键入的替换 替换字符序列 整行替换查询命令:(在冒号后) 待查字符 向前查 ? 待查字符 向前查 向下继续重复找 往下找拷贝、截取命令: 或 拷贝当前行 拷贝当前光标位置到x位置 将拷贝的文本置于光标后 将拷贝的文本置于光标前 |char 拖拉 拉至行尾 一行拉出(26)WC选项文件列表计算文件中的字符、字或行的数量。 项目 说明 文件列表 用空格分开的文件名列表 -c 只计算字符数 -w 只计算字数 -l 只计算行数实验二 命令解释程序一实验目的 通过本实验熟悉UNIX/Linux操作系统及C语言,熟悉系统调用的编程能力,了解命令解释程序的基本原理和实现方法。二实验内容1 了解命令解释程序的基本原理和实现方法;2 编程实现一个简单的命令解释程序。三验证实验 1实验要求 在UNIX/Linux环境下编写一个简单的shell程序,具有接收和解释、执行命令的功能。 2参考源代码/*a simple shell*/* use command leave to exit*/#include #include #include #include #include #include #define BUFFERSIZE 80extern char *get_current_dir_name(void);extern char *getenv(const char *name);extern pid_t waitpid(pid_t pid, int *status, int options);char bufferBUFFERSIZE+1;main() char *path, *arg10, *input; int li_inputlen, is_bj, is_back, i, j, k, pid, status; char lc_char; while (1) /* initiations */ is_bj = 0; /*redirection flag*/ is_back = 0; /*background*/ /* shell prompt */ path = get_current_dir_name(); printf(%s$,path); /*开始获取输入*/ li_inputlen = 0; lc_char = getchar(); while (lc_char !=n) if(li_inputlen = BUFFERSIZE) printf(Your command is too long! Please re-enter your command!n); li_inputlen = 0;/*reset */ continue; else bufferli_inputlen = 0;/*加上串结束符号,形成字串*/*将命令从缓存拷贝到input中*/input = (char *) malloc(sizeof(char) * (li_inputlen+1);strcpy(input,buffer);/* 获取命令和参数并保存在arg中*/ for (i = 0,j = 0,k = 0;i = li_inputlen;i+)/*管道和重定向单独处理*/ if (inputi = | inputi =|) if (inputi = |) pipel(input,li_inputlen); else redirect(input,li_inputlen); is_bj = 1; break; /*处理空格、TAB和结束符。不用处理n,大家如果仔细分析前面的获取输入的程序的话, *不难发现回车符并没有写入buffer*/ if (inputi = | inputi =t | inputi = 0)if (j = 0) /*这个条件可以略去连在一起的多个空格或者tab*/ continue;elsebufferj+ = 0; argk = (char *) malloc(sizeof(char)*j);/*将指令或参数从缓存拷贝到arg中*/ strcpy(argk,buffer); j = 0;/*准备取下一个参数*/k+; else/*如果字串最后是&,则置后台运行标记为1*/if (inputi = & & inputi+1 = 0) is_back = 1; continue;bufferj+ = inputi; free(input);/*释放空间*/*如果输入的指令是leave则退出while,即退出程序*/ if (strcmp(arg0,leave) = 0 ) printf(bye-byen); break; if (is_bj = 0) /*非管道、重定向指令*/*在使用xxec执行命令的时候,最后的参数必须是NULL指针, *所以将最后一个参数置成空值*/ argk = (char *) 0;/*判断指令arg0是否存在*/ if (is_fileexist(arg0) = -1 ) printf(This command is not found?!n); for(i=0;ik;i+) free(argi); continue; /* fork a sub-process to run the execution file */ if (pid = fork() =0) /*子进程*/ execv(buffer,arg); else/*父进程*/ if (is_back = 0) /*并非后台执行指令*/ waitpid(pid,&status,0); /*释放申请的空间*/ for (i=0;ik;i+) free(argi); int is_fileexist(char *comm) char *path,*p; int i; i = 0;/*使用getenv函数来获取系统环境变量,用参数PATH表示获取路径*/ path = getenv(PATH); p = path; while (*p != 0) /*路径列表使用:来分隔路径*/ if (*p != :) bufferi+ = *p; else bufferi+ = /; bufferi = 0;/*将指令和路径合成,形成pathname,并使用access函数来判断该文件是否存在*/ strcat(buffer,comm); if (access(buffer,F_OK) = 0)/*文件被找到*/ return 0; else/*继续寻找其它路径*/ i = 0; p+; /*搜索完所有路径,依然没有找到则返回-1*/ return -1;int redirect(char *in,int len) char *argv30,*filename2; pid_t pid; int i,j,k,fd_in,fd_out,is_in = -1,is_out = -1,num = 0; int is_back = 0,status=0;/*这里是重定向的命令解析过程,其中filename用于存放重定向文件, *is_in, is_out分别是输入重定向标记和输出重定向标记*/ for (i = 0,j = 0,k = 0;i = len;i+) if (ini= |ini=t|ini=0|ini =) if (ini = | ini = )/*重定向指令最多各出现一次,因此num最大为2, *否则认为命令输入错误*/ if (num 3) num +; if (ini = a*/ if (j 0 & num = 1) bufferj+ = 0; argvk = (char *) malloc(sizeof(char)*j); strcpy(argvk,buffer); k+; j = 0; else printf(The format is error!n); return -1; if (j = 0) continue; elsebufferj+ = 0;/*尚未遇到重定向符号,字符串是命令或参数*/ if (num = 0) argvk = (char *) malloc(sizeof(char)*j); strcpy(argvk,buffer); k+;/*是重定向后符号的字符串,是文件名*/else filenamestatus = (char *) malloc(sizeof(char)*j); strcpy(filenamestatus+,buffer);j = 0;/*initate*/ else if (ini = & & ini+1 = 0) is_back = 1; continue; bufferj+ = ini; argvk = (char *) 0; if (is_fileexist(argv0) = -1 ) printf(This command is not founded!n); for(i=0;ik;i+) free(argvi); return 0; if (pid = fork() =0)/*存在输出重定向*/ if (is_out != -1) if(fd_out=open(filenameis_out,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR)=-1) printf(Open out %s Errorn,filenameis_out); return -1; /*存在输入重定向*/ if (is_in != -1) if(fd_in=open(filenameis_in,O_RDONLY,S_IRUSR|S_IWUSR)=-1) printf(Open in %s Errorn,filenameis_out); return -1; if (is_out != -1) /*使用dup2函数将标准输出重定向到fd_out上,dup2(int oldfd,int newfd)实现的 *是把oldfd所指的文件描述符复制到newfd。若newfd为一已打开的文件描述词, *则newfd所指的文件会先被关闭,dup2复制的文件描述词与原来的文件描述词 *共享各种文件状态*/ if(dup2(fd_out,STDOUT_FILENO)=-1) printf(Redirect Standard Out Errorn); exit(1); if (is_in != -1) if(dup2(fd_in,STDIN_FILENO)=-1) printf(Redirect Standard Out Errorn); exit(1); execv(buffer,argv); else if (is_back = 0) /*run on the TOP*/ waitpid(pid,&status,0); for (i=0;ik;i+) free(argvi); if (is_in != -1) free(filenameis_in); close(fd_in); if (is_out != -1) free(filenameis_out); close(fd_out); return 0;int pipel(char *input,int len) char *argv230; int i,j,k,count,is_back = 0; int li_comm = 0,fd2,fpip2; char lc_char,lc_end1; pid_t child1,child2;/*管道的命令解析过程*/ for (i = 0,j = 0,k = 0;i 0) bufferj+ = 0; /*因为管道连接的是两个指令,所以用二维数组指针来存放命令和参数, *li_comm是表示第几个指令*/ argvli_commk = (char *) malloc(sizeof(char)*j); strcpy(argvli_commk+,buffer); argvli_commk+ = (char *) 0; /*遇到管道符,第一个指令完毕,开始准备接受第二个指令*/ li_comm+; count = k; k=0;j=0; if (j = 0) continue; else bufferj+ = 0; argvli_commk = (char *) malloc(sizeof(char)*j); strcpy(argvli_commk,buffer); k+; j = 0;/*initate*/ else if (inputi = & & inputi+1 = 0) is_back = 1; continue; bufferj+ = inputi; argvli_commk+ = (char *) 0; if (is_fileexist(argv00) = -1 ) printf(This first command is not found!n); for(i=0;icount;i+) free(argv0i); return 0; /*指令解析结束*/*建立管道*/ if (pipe(fd) = -1 ) printf(open pipe error!n); return -1; /*创建第一个子进程执行管道符前的指令,并将输出写到管道*/ if (child1 = fork() =0)/*关闭读端*/ close(fd0); if (fd1 != STDOUT_FILENO) /*将标准输出重定向到管道的写入端,这样该子进程的输出就写入了管道*/ if (dup2(fd1,STDOUT_FILENO) = -1) printf(Redirect Standard Out Errorn); return -1; /*关闭写入端*/ close(fd1); execv(buffer,argv0); else /*父进程*/*先要等待写入管道的进程结束*/ waitpid(child1,&li_comm,0);/*然后我们必须写入一个结束标记,告诉读管道进程数据到这里就完了*/ lc_end0 = 0x1a; write(fd1,lc_end,1); close(fd1); if (is_fileexist(argv10) = -1 ) printf(This command is not founded!n); for(i=0;ik;i+) free(argv1i); return 0; /*创建第二个进程执行管道符后的指令,并从管道读输入流 */ if (child2 = fork() = 0) if (fd0 != STDIN_FILENO) /*将标准输入重定向到管道读入端*/ if(dup2(fd0,STDIN_FILENO) = -1) printf(Redirect Standard In Error!n); return -1; close(fd0); execv(buffer,argv1); else /*父进程*/ if (is_back = 0) waitpid(child2,NULL,0); for (i=0;icount;i+) free(argv0i); for (i=0;ik;i+) free(argv1i); return 0;四设计实验 1实验要求1)利用C语言编写一个微型命令解释程序,接收并解释以下命令:dir: 列当前目录 cop 文件1 文件2: 拷贝文件 era 文件名: 删除文件 dis 字符串: 显示字符串end: 结束并退出2)进行命令合法性检查,若不合法,显示出错信息,等待重新输入; 3)命令前后有空格为合法命令。 2程序源代码(学生自行设计)实验三 进程管理一实验目的1加深对进程概念的理解,明确进程和程序的区别;2进一步认识并发执行的实质;3分析进程争用资源的现象,学习解决进程互斥的方法。4. 了解UNIX/Linux系统中进程通信的基本原理。二实验内容1阅读Linux的sched.h源代码,加深对进程管理概念的理解;2阅读Linux的fork.c源代码,分析进程的创建过程;3进程创建;4进程控制。5进程通信。三验证实验 1实验要求1) 进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。2)进程的控制修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 2参考源代码1) 进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。#includemain() int pl,p2; while (p1=fork()=-1); if(p1=O) putchar(b); else while(p2=fork()=-1); if(p2=O) putchar(c); else putchar(a); 运行结果:bca(有时会出现bac)分析:从进程并发执行来看,输出bac,acb等情况都有可能。原因:fork()创建进程所需的时间要多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了“b”,而进程2和主程序的输出次序是有随机性的,所以会出现上述结果。2)进程的控制 修改已编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业设计与制造技术创新
- 工业领域的能源管理培训教程
- 工作中的目标管理与实现路径
- 工作生活的平衡技巧探讨与应用实例
- 工业领域新能源技术的推广
- 工作与生活平衡的技巧
- 工程流体力学中的数学模型与数值模拟方法研究
- 工作汇报的快速制作技巧
- 工程索道设计与施工技术管理
- 工程机械的冷却系统设计与研究
- 后罗拉过桥摇臂-课程设计说明书
- 《Python少儿编程》PPT课件(共11章)第二章 Python 编程基础
- 配对样本t检验表格
- GB/T 91-2000开口销
- 青花瓷中国风ppt
- 2021年汽车吊载人吊篮作业安全专项措施
- 质量管理之CAPA教学课件
- 泌尿外科健康教育2膀胱冲洗健康宣教
- 焊接件通用技术要求
- 星子港件杂货港区总平面布置与码头结构设计
- 水墨印刷机操作规程
评论
0/150
提交评论