《操作系统实验报告样本》.docx
《《操作系统实验报告样本》.docx》由会员分享,可在线阅读,更多相关《《操作系统实验报告样本》.docx(28页珍藏版)》请在冰点文库上搜索。
![《操作系统实验报告样本》.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/fbbbdd98-107a-4bdd-8ee4-68ee2a3f4413/fbbbdd98-107a-4bdd-8ee4-68ee2a3f44131.gif)
《操作系统原理》
班级:
计科80902
学号:
090004208
姓名:
冯晓明 指导教师:
朱新山
2010-2011 学年 第 二 学期
实验名称:
LINUX用户界面
实验时间:
2011年4月27日 第10 周 星期3 成绩
一、实验目的
1.基于Windows系统使用经验,熟悉XWindow图形操作环境。
2.熟悉Linux字符操作界面,熟练掌握常用Shell命令。
3.熟悉Linux中文本编辑方法,学会编辑软件vi的使用。
4.了解Linux编绎器gcc的功能,掌握基于Linux平台的C程序开发。
二、实验预习(预备知识的问题及回答)
1.解释文件系统装载和装载点。
由于文件系统的差异,Linux在默认情况下并不支持软盘、光盘和U盘,所以需要通过装载相应盘片才可以访问其中的数据。
装载点是挂载文件系统的目录位置。
2.给出Linux系统中各设备的名称(虚拟机环境中):
软盘 fdo 光盘hdc 硬盘sda Usb接口的优盘 sdb1
。
3.权限的含义是什么?
如何使用数字法设定文件的权限?
权限的含义
Linux系统中的每个文件和目录都有相应的访问许可权限,访问权限分为只读(r),可写(w)和可执行三种。
有三种不同类型的用户可对文件或目录进行访问,分别是文件所有者(u),同组用户(g)和其他用户(o)。
所有的文件和目录都被创建它们的人所“拥有”,只要你是这个文件的所有者或你登录为根用户,你就拥有了改变所有者、组群和其他人权限的权利。
使用数字法改变权限
命令格式chmod权限数值文件名
说明给指定文件赋予数值所规定的权限。
在数字设定法中,每种权限设置均可用数值来代表,其中0表示没有权限,1表
示可执行权限,2表示可写权限,4表示可读权限,这些值之和便可用来设立特定权限。
所以数字属性的格式应为3个0~7的八进制数,3个数表示的次序为u、g和o。
例:
将文件file6设置为rwxr-x—x权限,命令为:
Chmod751file64.什么是I/O重定向?
(1)输入重定向<命令格式 命令<文件名
说明将命令(或可执行程序)的标准输入重定向到指定的文件中。
例:
cat
(2)输出重定向<命令格式 命令>文件名
说明将命令(或可执行程序)的标准输出或标准错误输出重定向到指定文件中。
例:
ls /etc>/test1/etc.txt表示将/etc目录下的文件列表输出到文件/text1/etc.txt中。
5.在Linux中挂载u盘并能显示其文档的中文信息,所使用的挂载命令是:
挂载U盘
命令格式 mount /dev/sda1 /mnt/usb 。
6.什么是vi的三种操作模式?
vi有3种基本工作模式:
命令模式(CommandMode)、输入模式(InsertMode)和末行模式(LastLineMode)。
7.图示三种工作模式转换图。
i,a,o
eso
输入模式
末行模式
:
,?
,/
命令模式
启动vi
三、实验内容(包含实验所用命令或相关程序源代码)
1.shell操作命令
(1)创建名为stu1、stu2的2个用户,设置密码分别为student1和student2 ,并将它们设为组group1中的成员。
#useraddstu1
#passwdstu1回车后敲入密码student1
#groupaddgroup1
#usremod –g group1stu1#useraddstu2–ggroup1
#sustu2
$passwd回车后敲入密码student2
(2)在每个用户的主目录下建立2个目录,分别命名为dir1和dir2。
[stu1@localhostroot]$cd~
[stu1@localhoststu1]mkdirdir1[stu1@localhoststu1]sustu2[stu2@localhoststu2]mkdirdir2
(3)查找stu1用户主目录、下属各子目录的默认存取权限,并给出结论。
$cd~
$ls–l
dir1目录权限为:
drwxr-xr-x,即目录的用户可读、写、执行,同组用户可读、执行,其他用户可读、执行。
$cd..
$ls–l
用户主目录权限为:
drwx ,即目录的用户可读、写、执行,同组和其他用户无任
何权限。
(4)调试pwd和cd命令,回答下列关于Linux文件系统中目录的有关问题。
①用户主目录的绝对路径如何表示?
/home/stu1,/home/stu2
②根目录如何表示?
/
③.和..分别表示什么目录?
本级目录,父目录
④~表示什么目录?
用户主目录
(5)新建用户stu3,设置其密码为student3,并将其设置为group2中成员。
尔后,以stu3登录,在其主目录下建立名为text的目录,在text目录下再建立名为dir1的子目录,并使其成为当前目录。
#groupaddgroup2
#useraddstu3–ggroup2#sustu3
$passwd回车后敲入密码student3
$cd~
$mkdirtext
$mkdirdir1
$cdtext/dir1
(6)使用以下命令,分析下列命令行的显示结果。
$cat>sneakers.txtbuysomesneakers
thengotothecoffeeshopthenbuysomecoff
^D
$catsneakers.txt
命令将输入重定向至文件sneakers.txt中,cat命令可以显示文本文件的内容。
(7)使用上题的方法,在dir1目录中建立home.txt文件,其内容为:
bringthecoffeehome
takeoffshoesputonsneakers
makesomecoffeerelax!
$cd/home/stu1/dir1
$cat>home.txt
bringthecoffeehometakeoffshoes
putonsneakersmakesomecoffeerelax!
[ctrl+D]
(8)试写出实现下列功能的shell命令:
①将home.txt文件移至其上级目录中(即text目录下)。
$mv./home.txt ..
②将home.txt添加到sneakers.txt尾部形成新的文件saturday.txt。
$catsneakers.txt>saturday.txt
$cathome.txt>>Saturday.txt
③将text目录树从stu3用户主目录下移至stu2主目录下。
$su
#mv /home/stu3/text /home/stu2
④将Saturday.txt文件从stu1目录中复制到stu2目录中。
#cp/home/stu1/saturday.txt /home/stu2
(9)试画出上述命令后,用户主目录中的目录树。
2.LinuxC程序开发
(1)使用cat>source命令,建立一个包含若干空行的source文本文件,编写C程序将source中的空行过滤后显示出来。
【源程序】
//程序compact.c如下:
#includemain()
{
intlen=0,i=0,j;
charc,line[100];while((c=getchar())!
=EOF)
{
If(c!
=’\n’)
{line[i]=c;i++;
if(c!
=’’&&c!
=’\t’) len++; //若该行有非空字符,则len长度增加
}
else
if(len>0)
{line[i]=c;
for(j=0;j<=I;j++)printf(“%c”,line[j]);len=0;
i=0;
}
}
}
gcc–o compact compact.ccat>source
thisisline1thisisline2
thisisline4
【运行与测试】:
./compact(2)使用C语言编写一个反向打印程序,使之能够将输入文件中文本行按逆序打印出来
(即后出现的文本行先打印)。
【源程序】#include#includemain()
{FILE*fp;
charc,buf[100];
inti=0,len=0,j=0,k;
fp=fopen(“myfile”,”w+”); //新建一个文件并输入while((c=getchar())!
=EOF)
{fputc(c,fp);len++;
}
len=len-1;
while((fseek(fp,-2L,1)==0)&&(j{c=fgetc(fp);
i++;j++; //i为每行的字符个数,j是总的字符个数
if(c==’\n’){fread(buf,i,1,fp);
for(k=0;k
i=0;}
if(j==len) {fseek(fp,-1,1); //fgetc读取字符后指针后移一个字符,所以要向前移
fread(buf,i,1,fp);
for(k=0;k
}
}
}
【运行与测试】
3.附加题
使用C语言编写一个词频统计程序,使之能够搜索指定单词在输入文件中的出现次数。
【源程序】
#include#includeintmain(argc,argv)intargc;
char*argv[];
{ inti,flag=0;match=0;charc,*str;
argv++;str=*argv;i=0;
while((c=getchar()!
=EOF)
{if((i{str++; i++;}else
{if((i==strlen(*argv))&&(c==’‘||c==’,’||c==’\t’))
//如果匹配的字符个数和输入字符数相等
{match++; i=0; str=*argv;}else
{if(c==’‘||c==’,’||c==’\t’)flag=0; //flag标志表示每次从单词首部开始比较
elseflag=1; //flag=1表示单词的第一个字母不匹配,无须再比较
}
}
}
Printf(“string:
%sappears%dtimes\n”,*argv,match);
}
【运行与测试】
四、调试体会
实验名称:
SHELL程序设计
实验时间:
年 月 日 第 周 星期 成绩
一、实验目的
1.熟悉Shell脚本编程的步骤,掌握基于Bash的Shell脚本开发。
2.掌握Shell脚本中变量、条件测试的使用。
3.掌握Shell脚本中的控制流结构和函数的使用。
二、实验预习(预备知识的问题及回答)
1.Linux系统默认的shell语言是什么?
欲查看该shell的版本,应使用什么命令?
Linux系统默认的shell语言是Bashshell。
欲查看该shell的版本,应使用的命令是:
$echo$BASH_VERSION
2.预习shell有关变量和参数的相关知识,回答下列问题。
(1)假设用户进行了如下的赋值操作:
$person=jenny
试给出下面命令的输出结果。
1)echoperson person
2)echo$person jenny
3)echo‘$person’ $person
4)echo“$person” jenny
(2)填充下列与环境变量、位置变量和预定义变量相关的表格。
Shell变量
定义
HOME
用于保存用户注册目录的绝对路径
PATH
保存用冒号分隔的目录路径,shell将按PATH变量中给出的顺序搜索这些目录,找到第一个与命令名一致的可执行文件
将被执行。
PWD
当前工作目录的绝对路径名,该变量取
值随cd命令的使用而变化。
PS1
主提示符,默认特权用户为#,普通用户
为$。
$0
表示当前shell程序的文件名。
$#
表示位置参数的个数。
$?
前一命令执行后返回的状态。
$$
当前进程的pid。
3.写出下列expr命令的输出:
expr index “value” ‘a’expr “value”:
‘v.*u’
expr “aaa”:
‘a\+’
expr “aaa”:
‘a\?
’
答:
2
4
3
1
三、实验内容
1. 编写Shell脚本,当用户输入要检索的字符串后,该程序能检索指定串在文件哪些行中出现及出现总次数。
【源程序】
若输出指定字符串出现的行数,脚本如下:
readstr
grep-c$str“myfile” #将myfile文件中匹配的行数输出
按题意,输出指定串在文中出现的位置和次数的脚本程序如下:
i=1 #记录字符串出现的位置num=0 #记录字符串出现次数readstr #读取一行
strlen=`expr length“$str”`whiletest$strlen–ne0
do
whiletest$strlen–ne0do
location=`expr index “$str” “.*.*”` #查找空格在字符串中出现的第一个位置
location1=`expr$location–1`
ss=`exprsubstr$str1$location1` #取空格前的字符串len=`exprlength“$ss”`
iftest“$ss”=“$1” #如果该字符串和输入的指定串(指定串作为第一个参数输入)相等
then
num=`expr$num+1`echo“thelocationis$i”fi
i=`expr$i+$len`i=`expr$i+1`
strlen=`expr$strlen-$len`strlen=`expr$strlen–1`location2=`expr$location+1`
str=`expr substr “$str” $location2$strlen`done
readstr
strlen=`expr length“$str”`done
echo“theword:
$1appears$numtimes”
2.编写Shell脚本,从命令行中接收一个二元算术表达式并计算其结果。
#!
/bin/bashiftest$#=3then
case$2in
+)letz=$1+$3;;
-)letz=$1-$3;;
/)letz=$1/$3;;x|X)letz=$1*$3;;
*)echo“Warning-$2invalidoperator!
”exit;;esac
echo“Answeris$z”else
echo“Usage-$0Value1operatorvalue2”
fi
【运行与测试】
2.编写Shell脚本,从命令行中接收一个二元算术表达式并计算其结果。
【源程序】
#!
/bin/bashiftest$#=3then
case$2in
+)letz=$1+$3;;
-)letz=$1-$3;;
/)letz=$1/$3;;x|X)letz=$1*$3;;
*)echo“Warning-$2invalidoperator!
”exit;;esac
echo“Answeris$z”else
echo“Usage-$0Value1operatorvalue2”
fi
【运行与测试】
3.编写一个以文件列表作为输入的过滤器程序,要求文件名含有以句点“.”分隔的后缀,过滤器输出每个文件的不带句点和后缀的文件名。
【源程序】
过滤器程序filter脚本程序如下:
readflag
while test “$flag” !
= “#” #输入的文件列表以井号结束do
location=`expr “$flag” :
“.*\.”`location=`expr $location–1`
basename=`expr substr “$flag” 1 $location`echo$basename
readflagdone
可以采用文件重定向输入,将含有后缀的文件列表存于filelist中,并以井号结束,之后修
改filter文件的可执行属性,再执行./filter【运行与测试】
4.编写shell脚本,统计/my目录下C语言文件的个数。
【源程序】
通过Bash脚本,可以有多种方式实现这个功能,而使用函数是其中的一个选择。
在使用函数之前,必须先定义函数。
首先进入自己的工作目录/home/stu1,用vi编写名为count的文件。
cd/home/student #在home/stu1目录下编程vicount
下面是脚本程序:
#!
/bin/bashfunction
cou
nt
{
echo –n “Numberofmatchesfor$1:
” #接受程序的第一个参数
ls $1|wc–l #对子程序的第一个参数所在的目录进行操作
}
执行:
将count文件复制到当前目录下,然后在当前目录下建立文件夹mymkdirmy
cdmy
vi1.c #在my目录下建立几个c文件,以便用来程序测试
……cd..
chmod+xcountcount“./my/*.c”
【运行与测试】
四、调试体会
实验名称:
进程控制与通信
实验时间:
年 月 日 第 周 星期 成绩
一、实验目的
1.加深进程概念的理解,体会进程创建过程,进一步认识进程的异步并发特征。
2.了解Linux系统中,进程通信的基本原理,重点掌握进程的信号通信和管道通信机制。
3.掌握Linux系统中,与进程控制和进程通信相关的系统调用。
二、实验预习(预备知识的问题及回答)
1.写出下列系统调用功能:
(1)fork()用于 创建进程
(2)getpid()用于 获取当前进程id号
(3)wait()用于 等待子进程结束
(4)exit()用于 进程自我终止
(5)pipe()用于 创建无名管道
(6)signal()用于 在信号和信号处理函数之间建立对应关系
(7)kill()用于 发送信号给指定进程
Pid>0
pid=fork()
2.画出fork系统调用的执行的逻辑框图。
Pid<0
Pid=0
Fork调用失败
当前进程是子程序
当前进程是父进程
3.图示pipe系统调用生成无名管道时所涉及的数据结构。
三、实验内容
1.调试下面的程序,观察可能的并发结果,给出简要分析,并画出进程家族树。
#include
#include#includemain()
{intstatus;
intpid1,pid2,pid3;pid1=fork();
if(pid1<0) {printf("errorinforkpid1!
");
exit(0);}
elseif(pid1==0)
printf("pid1=0,myprocessidis%d\n",getpid());elseif(pid1>0)
{pid2=fork();
if(pid2<0) {printf("errorinforkpid2!
");
exit(0);}elseif(pid2==0)
printf("pid2=0,myprocessidis%d\n",getpid());elseif(pid2>0)
printf("pid2>0,myprocessidis%d\n",getpid());
}
pid3=fork();
if(pid3<0) {printf("errorinforkpid3!
");
exit(0);}
elseif(pid3==0)
printf("pid3=0,myprocessidis%d\n",getpid());elseif(pid3>0)
printf("pid3>0,myprocessidis%d\n",getpid());wait(&status);
exit(0);
}
答:
可能的第一种结果:
pid1=0,myprocessidis1050pid2=0,myprocessidis1050pid1=0,myprocessidis1049pid2>0,myprocessidis1049pid1>0,myprocessidis1051pid2=0,myprocessidis1051pid1>0,myprocessidis1048pid2>0,myprocessidis1048可能的第二种结果:
pid1>0,myprocessidis1051pid2=0,myprocessidis1051pi