操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
学生学号
25
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称操作系统
开课学院计算机科学与技术学院
指导老师姓名刘军
学生姓名李安福
学生专业班级软件sy1201
2014—2015学年第一学期
《操作系统》实验教学大纲
课程编号:
课程名称:
操作系统/OperatingSystem
实验总学时数:
12学时
适应专业:
计算机科学与技术、软件工程
承担实验室:
计算机科学与技术学院实验中心
一、实验教学的目的和任务
通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台批处理和C程序开发调试手段等基本用法。
二、实验项目及学时分配
序号
实验项目名称
实验学时
实验类型
开出要求
01
Linux键盘命令和vi
2
设计
必开
02
Linux下C编程
2
设计
必开
03
SHELL编程和后台批处理
2
设计
必开
04
Linux系统调用(time)
2
设计
必开
05
Linux进程控制(fork)
4
设计
必开
三、每项实验的内容和要求:
1、Linux键盘命令和vi
要求:
掌握Linux系统键盘命令的使用方法。
内容:
见教材p4,p9,p40,p49-53,p89,p100
2、Linux下的C编程
要求:
掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。
内容:
设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。
3、SHELL编程和后台批处理
要求:
掌握Linux系统的SHELL编程方法和后台批处理方法。
内容:
(1)将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。
(2)将上面SHELLL程序后台运行。
观察原C程序运行时输入输出情况。
(3)修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容,然后输出到屏幕。
4、Linux系统调用使用方法。
要求:
掌握Linux系统调用使用方法。
内容:
学习使用time,ctime,sleep,exit等Linux系统调用使用方法。
5、Linux系统进程控制
要求:
掌握Linux系统中进程控制原语fork的使用方法。
内容:
设计C程序,其中主进程创建一个子进程,以特定次序各自执行规定操作后退出。
以上每项实验均要求每人一个Linux联机终端独立完成。
四、实验改革与特色
完成多用户分时系统Linux下的基本使用级观察级实验。
五、教材及实验指导书
教材:
孟静,《操作系统教程题解与实验指导》,高等教育出版社2002.6
执笔:
杨铭熙
审阅:
陈天煌日期2014年12月6
审定:
徐东平日期2014年12月6
实验课程名称:
操作系统
实验项目名称
Linux键盘命令和vi
实验成绩
实验者
李安福
专业班级
软件sy1201
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
Linux键盘命令和vi
要求:
掌握Linux系统键盘命令的使用方法。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
进入vi的命令:
vi :
打开或新建文件,并将光标置于第一行首
vi +n :
打开文件,并将光标置于第n行首
vi + :
打开文件,并将光标置于最后一行首
vi +/pattern :
打开文件,并将光标置于第一个与pattern匹配的串处
vi -r :
在上次正用vi编辑时发生系统崩溃,恢复
vi :
打开多个文件,依次进行编辑
键盘命令:
1.cat命令、more命令、less命令:
cat命令是将单个或多个文件的内容显示到屏幕上;more命令和less命令与cat命令相似,以分页形式显示文件内容。
2.ls命令:
将某一个目录或文件的内容显示出来
3.cp命令:
文件或目录的复制
4.rm命令:
删除文件或目录
5.mv命令:
将文件从一个位置移动到另一个位置
6.mkdir命令:
创建目录
7.rmdir:
删除空目录
三、主要仪器设备及耗材
安装Linux系统的计算机一台。
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
1使用mkdir命令建立一个子目录subdir
2使用cat或more命令查看file1文件的内容。
3将date命令的用法附加到文件file1的后面:
4利用ls-lfile1命令列出文件file1的较详细的信息。
5利用rmfa命令将文件fa删除。
再利用ls-l命令查看工作目录内容。
6运行mvfile1file_a命令,然后用ls命令查看这两个文件是否都还在工作目录中?
显然,只有file_a在工作目录中,而file1不在工作目录中
vi共分为三种模式
(1)命令模式:
命令模式为vi的初始模式,可以使用“上下左右”按键来移动光标,您可以使用“删除字符”或“删除整行”来处理文档。
在编辑模式或指令列模式中按【ESC】键可换回命令模式。
(2)编辑模式:
在命令模式中按下【i,I,o,O,a,A,r,R】等字母之后才会进入编辑模式。
按下上述的字母时,在画面的左下方会出现【--INSERT--或--插入--】的字样,才可以做文字数据输入。
(3)指令列模式:
在命令模式当中,输入【:
】或【/】就可以将光标移动到最底下那一行,进入指令列模式。
在这个模式当中,可以存盘、结束vi、显示行号等操作。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
Free显示系统中已用空闲内存数量
top:
查看系统进程情况
三、实验小结、建议及体会
vi编辑器是Linux系统下标准的编辑器,它的强大不逊色于任何文本编辑器。
初次实验对Linux常用命令及编辑器的使用操作都不熟悉,但对Linux很好奇。
通过实验,学会了如何在现有操作系统的基础上再打开一个操作系统,并对新的窗口进行操作。
开始进入的界面有点像DOS环境下的界面,接着可以输入一些语句命令来创建和查看文件、查看根目录及根目录下的内容,以及如何进入文件夹、如何编译并推出编译等。
学会vi有助于我们学习Linux。
实验课程名称:
操作系统
实验项目名称
Linux下C编程
实验成绩
实验者
李安福
专业班级
软件sy1201
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
Linux下的C编程
要求:
掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。
内容:
设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
#include
int main()
{
int a, b;
printf("shu ru liang ge shu:
\n");
scanf("%d,%d",&a,&b);
if(a>b)
{
b = a;
}
printf("max = %d\n",b);
return 0;
}
三、主要仪器设备及耗材
Linux操作系统
Vi编辑器
gcc编译
第二部分:
实验调试与结果分析(可加页)
一、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
二、实验小结、建议及体会
通过这次实验vi编辑器有了进一步的应用,同时学会了在Linux进行简单的C语言编程,掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。
加深了对linux的印象,linux的兼容性很强。
C/C++仍旧可以在上面编译成功。
在以后的学习中会加大努力加强自己的编程能力。
实验课程名称:
操作系统
实验项目名称
SHELL编程和后台批处理
实验成绩
实验者
李安福
专业班级
软件sy1201
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
三、实验内容描述(问题域描述)
SHELL编程和后台批处理
要求:
掌握Linux系统的SHELL编程方法和后台批处理方法。
内容:
(1)将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。
(2)将上面SHELLL程序后台运行。
观察原C程序运行时输入输出情况。
(3)修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容,然后输出到屏幕。
四、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
C程序文件如下
#include
int main()
{
int a, b;
printf("shu ru liang ge shu:
\n");
scanf("%d,%d",&a,&b);
if(a>b)
{
b = a;
}
printf("max = %d\n",b);
return 0;
}
test.sh文件如下
#!
/bin/bash
gcc-ot
chmodu+xtest.out
./test.out
三、主要仪器设备及耗材
linux操作系统
Vi编辑器
Gcc
Bash
第二部分:
实验调试与结果分析(可加页)
四、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
调试过程中未发现任何问题
五、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
六、实验小结、建议及体会
在实验中,我学习了Linux中的shell编程语法。
其实在shell中可以实现许多用C语言或者其他语言编写的程序功能,并且用shell更加快捷,因为它无需编译,是解释性语言。
此次实验让我对Linux下的编程有了进一步的了解。
实验课程名称:
操作系统
实验项目名称
Linux系统调用(time)
实验成绩
实验者
李安福
专业班级
软件sy1201
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
Linux系统调用使用方法。
要求:
掌握Linux系统调用使用方法。
内容:
学习使用time,ctime,sleep,exit等Linux系统调用使用方法。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
#include
#include
#include
#include
usingnamespacestd;
intmain()
{
while
(1)
{
chartimebuf[100];
time_tt;
time(&t);
strftime(timebuf,sizeof(timebuf),"%Y年%m月%d日%H:
%M:
%S",localtime(&t));
cout<fflush(stdout);
sleep
(1);
}
return0;
}
三、主要仪器设备及耗材
Ubuntu操作系统
Vi编辑器
G++编译器
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
ctime(将时间和日期以字符串格式表示)
表头文件
#include
定义函数
char *ctime(const time_t *timep);
函数说明
ctime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回。
此函数已经由时区转换成当地时间,字符串格式为“Wed Jun 30 21 :
49 :
08 1993\n”。
若再调用相关的时间日期函数,此字符串可能会被破坏。
返回值
返回一字符串表示目前当地的时间日期。
time(取得目前的时间)
表头文件
#include
定义函数
time_t time(time_t *t);
函数说明
此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。
如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。
返回值
成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
sleep(让进程暂停执行一段时间)
表头文件
#include
定义函数
unsigned int sleep(unsigned int seconds);
函数说明
sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。
返回值
若进程暂停到参数seconds 所指定的时间则返回0,若有信号中断则返回剩余秒数。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
三、实验小结、建议及体会
通过这次实验学习使用time,ctime,sleep,exit等Linux系统调用使用方法,加深了对Linux下编程的理解,在以后会多多了解Linux系统调用的更多方法,并多加练习。
实验课程名称:
操作系统
实验项目名称
Linux进程控制(fork)
实验成绩
实验者
李安福
专业班级
软件sy1201
组别
同组者
实验日期
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
Linux系统进程控制
要求:
掌握Linux系统中进程控制原语fork的使用方法。
内容:
设计C程序,其中主进程创建一个子进程,以特定次序各自执行规定操作后退出。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
#include
#include
#include
usingnamespacestd;
intmain()
{
cout<<"Parentprocessid:
"<pid_tiRet=fork();
if(iRet<0)
cout<<"Createchildprocessfail!
"<elseif(iRet==0)
{
cout<<"I'mchildprocess,andidis"<"<}
else
{
cout<<"Createchildprocesssuccesschild"<<"theidis:
"<}
return0;
}
三、主要仪器设备及耗材
Ubuntu操作体统
Vi编辑器
G++编译
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
(1)【进程的创建】
编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
【源程序】:
#include
intmain()
{
intp1,p2;
while((p1=fork())==-1);
if(p1==0)//第一子进程
putchar('b');
else{
while((p2=fork())==-1);
if(p2==0)
putchar('c');//第二子进程
else
putchar('a');//父进程
}
return0;
}
运行多次:
主要输出有bca,偶尔输出cab和cba,abc,bac,acb…会有如此多种不同输出,主要是因为fork()生成的子进程和父进程是并行运行的,所以先运行哪个进程是由系统的调度算法决定的,ubuntu9.04很大概率系统会先输出bca是因为ubuntu9.04在fork()运行之后很大概率先运行子进程,再运行父进程。
当然也有可能先运行父进程后子进程,再加上进程间的并发性;导致了输出的多样性。
输出次序带有随机性。
(2)【进程的控制】
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话。
【源代码】:
#include
intmain(){
intp1,p2;
while((p1=fork())==-1);
if(p1==0);第一个子进程
printf("Child1isrunning!
\n");
else{
while((p2=fork())==-1);
if(p2==0);第二子进程
printf("Child2isrunning!
\n");
else;父进程
printf("Fatherisrunning!
\n");
}
return0;
}
运行多次,大部分运行后输出:
Child1isrunning!
Child2isrunning!
Fatherisrunning!
少数输出:
Child2isrunning!
Child1isrunning!
Fatherisrunning!
Fatherisrunning!
Child1isrunning!
Child2isrunning!
……
理论上是有6种不同的结果,还是由于系统的调度算法,程序的并发性影响;但由于函数printf()在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。
所以与打印单字符的结果相同。
(3)【进程信号处理】
编写程序使用系统调用fork()创建两个子进程,再用系统调用singal()让父进程捕捉键盘上来的中断信号(即按Ctrl+c键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
ChildProcess11isKilledbyParent!
ChildProcess12isKilledbyParent!
父进程等待两个子进程终止后,输出如下的信息后终止:
ParentProcessisKilled!
【源代码】:
#include
#include
intwait_mark;
voidwaiting()
{
while(wait_mark==1);
}
voidstop()
{
wait_mark=0;
}
intmain()
{
intp1,p2;
while((p1=fork())==-1);
if(p1==0);第一个子进程
{
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(16,stop);
waiting();
lockf(1,1,0);;加锁
printf("ChildProcess11isKilledbyParent!
\n");
lockf(1,0,0);;解锁
exit(0);
}
Else
{
while((p2=fork())==-1);
if(p2==0);第二个子进程
{
wait_mark=1;
signal(SIGINT,SIG_IGN);
signal(17,stop);
waiting();
lockf(1,1,0);;加锁
printf("ChildProcess12isKilledbyParent!
\n");
lockf(1,0,0);;解锁
exit(0);
}
Else;父进程
{
wait_mark=1;
signal(SIGINT,stop);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("ParentProcessisKilled!
\n");
exit(0);
}
}
}
输出结果有两种:
ChildProcessllisKilledbyParent!
ChildProcessl2isKilledbyParent!
ParentprocessisKilled!
ChildProcessl2isKilledbyParent!
ChildProcessllisKilledbyParent!
ParentprocessisKilled!
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
三、实验小结、建议及体会
在本实验中,我学习了在Linux中利用fork来创建子进程的过程。
加深了对进程、子进程、进程号等概念的直观认识。
通过实验掌握Linux系统中进程控制原语fork的使用方法。
同时发现自己对Linux有很多的不熟悉的地方,在以后会进一步加强。