《操作系统原理》实验指导书.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流操作系统原理实验指导书.精品文档.操作系统原理实验指导书1、Linux环境下基本命令的使用2、进程管理实验3、命令解释程序的实现1、 实验一Linux环境下基本命令的使用一、实验目的:(1)掌握Shell命令在Unix或Linux操作系统中的作用。(2)理解Shell命令的解释和运行机制。(3)掌握Unix或Linux系统环境下的常用的Shell基本操作命令。二、 实验内容:(1) 查看系统的命令提示符,确定系统使用的Shell程序类型,列出Linux系统常见的Shell种类。(2) 查看当前登录在系统中的用户列表、系统中的用户总数和系统启动时间。(3) 查看当前的日期和时间。(4) 显示当前目录,改变到用户主目录并列出当前目录的内容。(5) 在当前目录下,创建名为 “自己姓名(用自己学号代替)”的新目录。在所创建的目录下创建名为“newfile”的新文件。(6) 在屏幕上显示文件newfile的内容。(7) 删除“自己姓名”中的newfile文件。(8) 当前目录的目录“自己姓名”。(9) 列出所有文件。三、 实验步骤:1、登录和退出<1> 登录服务器系统: root (实际的用户名自己设置)。<2> 在login:后输入用户帐号(第一次进入输入 root): 密码:未知<3> 登录后,输入passwd命令来修改密码。根据提示输入当前密码,再输入两次新的密码。<4> 输入logout命令或exit命令退出系统。2、 获取帮助信息命令man提供了系统操作命令的在线帮助。例如,输入man passwd 可以获取命令passwd的帮助说明;输入man open 可以获取open 函数的帮助说明。按空格键,翻页浏览。按<shift><:>,再按q退出帮助。 3、 基本操作命令<1>pwd:确定你当前的工作目录<2> ls -al:显示当前工作目录的内容<3> mkdir:建立一个子目录<4> cd:转换目录<5> cat或more:查看文件内容<6> cp:复制文件<7> rm -i:删除文件<8> mv:重命名文件<9> find:查找文件<10> vi编辑命令新文件<11> who查看当前登录在系统中的用户列表、系统中的用户总数和系统启动时间。各个命令的具体使用方法,可以用man命令查看。4、 vi编辑器vi编辑器是一个小巧但功能强大的程序。vi编辑器有三种不同的模式:插入模式这个模式是通过在命令模式按下“i”键进入的。命令模式这是用户输入单键命令的模式。在其他模式中按下ESC键就可以进入命令模式。 常见的执行删除操作的命令有: dd 删除整个行 #dd 按照输入的数字(),从当前行删除几行 D 删除光标位置后面全部内容 dw 删除光标所在位置的单词冒号模式从命令模式输入一个冒号(:)就可以进入这个模式。常见的冒号模式命令有:wq 保存且退出编辑器:w 保存但不退出:q 退出且不保存:q! 强行退出vi,不保存。:help 获取帮助1) 在系统提示符($)下输入命令vi和想要编辑(建立)的文件名vi test.c <enter>2) 按键I进入插入模式。屏幕上看不到字符i,屏幕下方出现-INSERT-字样。3) 输入你的程序:#include <stdio.h>void my_print1(char *);void my_print2(char *);main ()char string = “hello world”;my_print1 (string); my_print2 (string);void my_print1(char *string) printf(“The string is %sn”, string);void my_print2(char *string)char *string2; int size, i; size = strlen (string); string2 = (char *) malloc (size + 1); for (i = 0; i < size; i+) string2size i = stringi;string2size+1 = 0; printf (“The string printed backward is %sn”, string2); 4) 按Esc键,从插入模式进入冒号模式。5) 输入wq,保存退出四、 实验报告要求:1记录输入LINUX相关命令后系统输出。2使用过程出现的问题及解决方法实验二: 进程管理实验一、实验目的:(1)了解有关Linux系统调用。(2)学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。(3)加深对进程概念的理解,明确进程和程序的区别。二、实验内容(1)进程的创建。 在Linux环境下,编写一个程序使用系统调用fork()创建2个子进程。当此子进程运行时,在系统中由一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符x,子进程分别显示y和z。试记录屏幕上的显示结果,并分析原因。(2)进程的管道通信。编写一个程序使用系统调用fork生成3个子进程,并使用系统调用pipe创建一个管道,使得这3个子进程和父进程公用同一管道进行信息通信要求该程序实现数据的输入、输出以及信息提示(3)加深对进程概念的理解,明确进程和程序的区别。三、实验提示:(一)、Linux的系统调用1. 进程控制的系统调用l 1)fork系统调用创建新的子进程格式: pid=int fork()fork调用返回时,系统中已有两个用户级环境完全相同的进程存在,这两个进程从fork调用中得到的返回值不同,其中子进程得到的返回值为零,父进程得到的返回值是新创建子进程的进程标识号。l2)exec系统调用 格式:int execl(path,arg0,arg1,argn,(char *)0)char *path, *arg0, *arg1, , *argn ;exec调用进程的正文段被指定的目标文件的正文段所覆盖,其属性的变化方式与fork成功后从父进程那里继承属性的方式几乎是一样的。系统中绝大多数命令都是通过exec来执行的,不但shell进程所创建的子进程使用它来执行用户命令,shell进程本身和它的祖先进程也是用exec来启动执行的。l3) exit 系统调用终止进程执行格式:void exit(status) ;int status ;参数status是调用进程终止时传递给其父进程的值。如调用进程还有子进程,则将其所有子进程的父进程改为1号进程。4) wait 系统调用等待子进程暂仃或终止格式:int wait(stat_loc) int wait(int *)0)int stat_loc ;wait 调用将调用进程挂起,直到该进程收到一个被其捕获的信号或者它的任何一个子进程暂仃或终止为止。如果wait 调用之前已有子进程暂仃或终止,则该调用立即返回。5) lockf 锁定文件格式:int lockf(fd,fuction,size)int files, fuction; long size; fd 锁定文件标识function=0表示不锁定;function =1(锁定);function2(测试和锁定);function3测试有否被锁定size -锁定或解锁的字节数,0表示从文件的当前位置到文件尾。(二)、进程创建程序include <stdio.h>void main(int argc, char *argv ) int pid;pid=fork(); /* fork child process */if (pid<0) fprintf(stderr, “Fork Failed”); exit(-1);else if (pid= =0) /* child process */ execlp(“/bin/ls”,”ls”,NULL);else /* 进入父进程 */wait(NULL);printf(“child Complete”);exit(0);(三)、进程通信的系统调用函数实例l 1)pipe系统调用格式: int pipe (filedes)int filedes 2;管道通信程序#include <stdio.h>#include <fcntl.h>char parent=“A message from parent .”;char child=“A message from child .”;main()int chan12,chan22;char buf100;if (pipe(chan1)=-1 | pipe(chan2)=-1) errexit(“pipe”);if (fork()close(chan10); close(chan21);write(chan11,parent,sizeof parent);close(chan11);read(chan20,buf,100);printf(“parent process : %s n”,buf);close(chan20);elseclose(chan11); close(chan20);read(chan10,buf,100);printf(“child process : %s n”,buf);write(chan21,child,sizeof child);close(chan21); close(chan10);四、程序实现1、 进程的创建2、 进程间通信的实现五、实验报告要求1记录输入LINUX相关命令后系统输出。2记录C程序,进行编译运行和调试。3分析运行结果。4体会实验三综合上机命令解释程序的实现 一、实验目的:实现一个简单的命令解释程序,掌握操作系统命令解释程序的实现原理。二、实验内容:编写C程序parse来完成一个简单的命令解释程序,能够支持以下四个命令: quit、disp、list、changedir。三、实验要求:(1)parse应提供一个命令提示符,如parse>,表示接收用户的输入,每次执行完成后再打印下一个命令提示符parse>。当用户没有输入时,parse需要一直处于随时等待输入状态,同时再屏幕上显示一些必要的信息。(2)如果用户提交了一个内部命令,parse应当按照下面的描述执行相应动作。l quit:结束所有的子进程并退出parse.l disp: 显示命令行后的所有字符。l list:列出当前目录下的所有文件。l changedir:改变当前目录到所输入目录。(3)分析用户输入 1)分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。如用户输入的某些地方出错了,parse应提供合理的出错信息。 2)就像shell一样,parse每次接受用户输入的一行命令,在用户按下回车键(Enter)后开始执行分析动作。四、实验环境 本实验的程序用C语言编写,使用makefile文件编译整个程序,生成一个名为parse可执行程序,在终端输入“/parse”即可执行。makefile文件的内容如下: parse: parse.c cc parse.c o parse五、流程图开始输入一行命令是什么命令?退出文件处理程序结束是否操作命令显示文件处理程序列文件处理程序改变目录文件处理程序是quitdisplistchangedir否六、程序实现l quit:退出parse程序的执行.l disp: 显示命令行后的所有字符。l list:列出当前目录下的所有文件。l changedir:改变当前目录到所输入目录。#include "stdio.h"#include "string.h"#include "unistd.h"char real_cmd200,reference200;get_cmd(char cmd200) int i=0,j=0,k=0; real_cmd0='0' reference0='0' while (cmdi!='0' && cmdi=' ' i+; while (cmdi!='0' && cmdi!=' ' real_cmdj+=cmdi+; real_cmdj='0' if (cmdi!='0') strcpy(reference,cmd+i+1);main() char cmd200; int quit=0,ch=0,cmd_len,c10; while (quit=0) printf(">"); fgets(cmd,200,stdin); cmdstrlen(cmd)-1='0' get_cmdcmd; if (real_cmd0='0' continue; printf("input command:%s%sn",real_cmd,reference); if (strcmp(real_cmd,"list")=0) sprintf(cmd,"ls %s",reference); system(cmd); else if ( ) quit=1; else if (strcmp(real_cmd,"changedir")=0) if (reference!=NULL) if (chdir(reference)<0) printf("changedir:%s Error file or directory!n",reference); else if (strcmp(read_cmd,"disp")=0) else if (strcmp(real_cmd,"pwd")=0) system("pwd"); else printf("unknown commandn");七、实验报告要求1记录输入LINUX相关命令后系统输出。2记录C程序,进行编译运行和调试。3分析运行结果。4体会