实验报告课程名称操作系统实验项目名称操作系统班级0411003实验室名称S331A专业计算机科学与技术任课教师XXX学号:XXX姓名:XXX实验日期:2012年12月5日姓名实验报告成绩完成情况项目很好好一般及格差实验目的实现实验内容完成实验步骤和操作是否符合要求分析与思考总成绩指导教师(签名)年月日实验一Linux基本环境1、实验目的(1)熟悉Linux下的基本操作,学会使用各种Shell命令去操作Linux,对Linux有一个感性认识。(2)学会使用vi编辑器编辑简单的C语言程序,并能对其编译和调试。2、实验预备内容(1)参阅相关Linux操作系统的安装手册,熟悉Linux的基本安装和配置;(2)参阅相关Linux的命令参考手册,熟悉Linux下的操作命令。3、实验内容以普通用户身份登陆,并使用“ls”,“cat”“cd”等命令来实现基本的文件操作并观察Linux文件系统的特点;使用vi编辑器编写一个C程序,并用gcc命令进行编译和链接,并用a.out来进行输出结果。4、思考(1)Linux系统在用户登陆和操作界面以及文件系统上有哪些特点?linux是真正的多用户:同一时刻可以有多个用户同时登陆一台linux,而且linux下的大多程序是支持多用户的。linux操作界面是命令行式的,黑底白字的DOS样子。linux最重要的特点是支持多个不同的文件系统,在linux中,一个分离的文件系统不是通过设备标识来访问,而是把它合到一个单一的目录树结构中,通过目录来访问。5、实验步骤(3)进行如下常用命令练习:练习使用命令ls(注意Linux命令区分大小写。)使用ls查看当前目录内容;使用ls查看指定目录内容,如/目录,/etc目录使用ls–all查看当前目录内容;使用dir查看当前目录内容使用cd改变当前目录cd..回到上层目录;cd/回到根目录pwd显示当前路径建立目录mkdirmkdir目录名;mkdir/home/s2001/newdir删除目录:rmdir;复制文件cp:如cp文件名1文件名2移动文件或目录:mv删除文件rm显示文件内容:more(分页显示);显示文件:cat文件名建立文件:cat文件名,ctrl+d结束输入(4)使用编辑器vi编辑文件1.进入linux的文本模式之后,在命令行键入vifilename.c然后回车。在此作一些简单的解释:首先vi命令是打开vi编辑器。后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2.最基本的命令i:当进入刚打开的文件时,不能写入信息,这时按一下键盘上的字母“I”键(insert的第一个字母),插入的意思,就可以进入编辑模式了。如下图所示:3.当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的Esc键;2)键入冒号(:),紧跟在冒号后面是wq(意思是保存并退出)。如果不想保存退出,则在第二步键入冒号之后,键入q!(不带w,机尾部保存)。如下图所示:4.退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gccfilename.c[-ooutputfilename.out],其中gcc是c的编译器。参数:filename.c是要编译的源文件的名称,outputfilename表示输出文件名称,中括号表示括号内部的内容可输入也可以不输入(中括号本身不再命令行中出现)。如果不输入outputfilename.out,默认的输出文件是a.out。5.最后一步是运行程序,方法如下:./outputfilename.out实验2进程管理(上)1、实验目的(1)加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。3、实验内容(1)首先分析该段程序输出结果,然后再输入该段代码编译并运行,看看结果和自己的分析有没有不同,如果有不同,分析其原因。#includestdio.hintmain(void){inti;i=fork();printf(i=%d\n,i);return0;}运行结果:bca(有时会出现abc的任意的排列)分析:从进程执行并发来看,输出abc的排列都是有可能的。原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。(2)进程的创建编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。〈程序〉#includestdio.hmain(){intp1,p2;if(p1=fork())/*子进程创建成功*/putchar('b');else{if(p2=fork())/*子进程创建成功*/putchar('c');elseputchar('a');/*父进程执行*/}}运行结果bca(有时会出现abc的任意的排列)分析:从进程执行并发来看,输出abc的排列都是有可能的。原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。(3)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。〈程序1〉#includestdio.hmain(){intp1,p2,i;if(p1=fork()){for(i=0;i500;i++)printf(parent%d\n,i);wait(0);/*保证在子进程终止前,父进程不会终止*/exit(0);}else{if(p2=fork()){for(i=0;i500;i++)printf(son%d\n,i);wait(0);/*保证在子进程终止前,父进程不会终止*/exit(0);/*向父进程信号0且该进程推出*/}else{for(i=0;i500;i++)printf(“grandchild%d\n,i);exit(0);}}}〈运行结果〉parent….son…grandchild…grandchild…或grandchild…son…grandchild…son…parent分析:由于函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。4、思考(1)系统是怎样创建进程的?linux系统创建进程都是用fork()系统调用创建子进程由fork()系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号。实验3进程管理(下)1、实验目的(1)加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。(3)分析进程竞争资源现象,学习解决进程互斥的方法。(4)了解Linux系统中进程通信的基本原理。2、实验预备内容(1)阅读Linux中fork,signal,lockf等系统调用的功能和用法。(2)了解什么是管道,了解进程间通信的常用方法。3、实验内容(1)编写一段程序,使其现实进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!父进程等待两个子进程终止后,输出如下的信息后终止ParentProcessisKilled!〈程序〉#includestdio.h#includesignal.h#includeunistd.hvoidwaiting(),stop(),alarming();intwait_mark;main(){intp1,p2;if(p1=fork())/*创建子进程p1*/{if(p2=fork())/*创建子进程p2*/{//父进程wait_mark=1;signal(SIGINT,stop);/*接收到^c信号,转stop*/signal(SIGALRM,alarming);/*接受SIGALRMwaiting();kill(p1,16);/*向p1发软中断信号16*/kill(p2,17);/*向p2发软中断信号17*/wait(0);/*同步*/wait(0);printf(parentprocessiskilled!\n);exit(0);}else{wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);/*忽略^c信号*/while(wait_mark!=0);lockf(1,1,0);printf(childprocess2iskilledbyparent!\n);lockf(1,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN);/*忽略^c信号*/while(wait_mark!=0);lockf(1,1,0);printf(childprocess1iskilledbyparent!\n);lockf(1,0,0);exit(0);}}voidwaiting(){sleep(5);if(wait_mark!=0)kill(getpid(),SIGALRM);}voidalarming(){wait_mark=0;}voidstop(){wait_mark=0;}运行结果:不做任何操作等待五秒钟父进程会在子进程先退出后再退出,并打印退出的顺序;或者点击ctrl+C后程序退出并打印退出的顺序。(2)编制一段程序,实现进程的管理通信。使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道中写一句话:Child1issendingamessage!Child2issendingamessage!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。程序#includeunistd.h#includesignal.h#includestdio.hintpid1,pid2;//定义两个进程号参数intmain(){intfd[2];/*定义一个数组作为sys_pipe()的参数*/charOutPipe[100],InPipe[100];pipe(fd);/*调用sys_pipe()创建管道线*/while((pid1=fork())==-1);if(pid1==0){/**/**根据sys_pipe()函数的定义fd[1]用于向管道写数据*/lockf(fd[1],1,0);/*锁定管道写入端fd[1]*//*进程1向管道写入要输出的句子*/sprintf(OutPipe,/nChildprocess1issendingmessage!/n);write(fd[1],OutPipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{while((pid2=for