
操作系统实验报告
协恩中学-能源管理体系培训
2023年2月16日发(作者:4字游戏名字)武汉理工大学学
生实验报告书
实验课程名称
开课学院
指导老师姓名
学生姓名
学生专业班级
操作系统
计算机科学与技术学院
刘军
李安福
软件sy1201
2014—2015学年第一学期
学生学号
5
实验课成绩
《操作系统》实验教学大纲
课程编号:
课程名称:操作系统/OperatingSystem
实验总学时数:12学时
适应专业:计算机科学与技术、软件工程
承担实验室:计算机科学与技术学院实验中心
一、实验教学的目的和任务
通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台
批处理和C程序开发调试手段等基本用法。
二、实验项目及学时分配
序号实验项目名称实验学时实验类型开出要求
01Linux键盘命令和vi2设计必开
02Linux下C编程2设计必开
03SHELL编程和后台批处理2设计必开
04Linux系统调用(time)2设计必开
05Linux进程控制(fork)4设计必开
1每项实验的内容和要求:
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的命令:
vifilename:打开或新建文件,并将光标置于第一行首
vi+nfilename:打开文件,并将光标置于第n行首
vi+filename:打开文件,并将光标置于最后一行首
vi+/patternfilename:打开文件,并将光标置于第一个与pattern匹配
的串处
vi-rfilename:在上次正用vi编辑时发生系统崩溃,恢复filename
vifilename....filename:打开多个文件,依次进行编辑
键盘命令:
命令、more命令、less命令:cat命令是将单个或多个文件的内
容显示到屏幕上;more命令和less命令与cat命令相似,以分页形式显示文件
内容。
命令:将某一个目录或文件的内容显示出来
命令:文件或目录的复制
命令:删除文件或目录
命令:将文件从一个位置移动到另一个位置
命令:创建目录
:删除空目录
三、主要仪器设备及耗材
安装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
intmain()
{
inta,b;
printf("shurulianggeshu:n");
scanf("%d,%d",&a,&b);
if(a>b)
{
b=a;
}
printf("max=%dn",b);
return0;
}
三、主要仪器设备及耗材
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
intmain()
{
inta,b;
printf("shurulianggeshu:n");
scanf("%d,%d",&a,&b);
if(a>b)
{
b=a;
}
printf("max=%dn",b);
return0;
}
文件如下
#!/bin/bash
gcc-ot
chmodu+
./
三、主要仪器设备及耗材
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(consttime_t*timep); 函数说明 ctime()将参数timep所指的time_t结构中的信息转换成真实世界所使用的时间日期表 示方法,然后将结果以字符串形态返回。此函数已经由时区转换成当地时间,字符串格 式为“WedJun3021:49:081993n”。若再调用相关的时间日期函数,此字符串可能 会被破坏。 返回值 返回一字符串表示目前当地的时间日期。 time(取得目前的时间) 表头文件 #include 定义函数 time_ttime(time_t*t); 函数说明 此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒 数。如果t并非空指针的话,此函数也会将返回值存到t指针所指的内存。 返回值 成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。 sleep(让进程暂停执行一段时间) 表头文件 #include 定义函数 unsignedintsleep(unsignedintseconds); 函数说明 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"< is:"< } 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有很多的不熟悉的地方,在以后会 进一步加强。