操作系统实验报告书 施敏宇.docx
《操作系统实验报告书 施敏宇.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告书 施敏宇.docx(32页珍藏版)》请在冰点文库上搜索。
![操作系统实验报告书 施敏宇.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/fae19eea-16a4-4a28-b9fe-ad5641d23068/fae19eea-16a4-4a28-b9fe-ad5641d230681.gif)
操作系统实验报告书施敏宇
《操作系统原理》
实验报告书
班级:
信息1101
学号:
*********
*******
*******
2013-2014学年第一学期
实验名称:
LINUX用户界面
实验时间:
年月日第周星期
一、实验目的
1.熟悉Linux字符操作界面,熟练掌握常用Shell命令。
2.熟悉Linux中文本编辑方法,学会编辑软件vi的使用。
3.了解Linux编绎器gcc的功能,掌握基于Linux平台的C程序开发。
二、实验预习(预备知识的问题及回答)
1.为什么在Linux系统中,诸如光盘、U盘等要先挂载而后才能使用?
如何获得U盘的设备名?
装载点在文件系统中的位置是什么?
答
由于文件系统的差异,linux在默认情况下并不支持软盘光盘U盘,所以需要装在相应的盘片才能访问其中的数据
装载点就是挂载文件系统的目录位置
2.从虚拟机界面退出进入WindowsOS界面的操作是ctrl+ait,从WindowsOS界面进入虚拟机界面的方法是鼠标点击虚拟机界面。
3.权限的含义是什么?
如何使用数字法设定文件的权限?
答
权限的含义
Linux系统中的每个文件和目录都有相应的访问许可权限,访问权限分为只读(r),
可写(w)和可执行三种。
有三种不同类型的用户可对文件或目录进行访问,分别是文件所
有者(u),同组用户(g)和其他用户(o)。
所有的文件和目录都被创建它们的人所“拥有”,只要你是这个文件的所有者或你登录为根用户,你就拥有了改变所有者、组群和其他人权限的权利。
使用数字法改变权限
命令格式
chmod 权限数值文件名
说明
给指定文件赋予数值所规定的权限。
在数字设定法中,每种权限设置均可用数值来代表,其中
0表示没有权限,
1表示可执行权限,
2表示可写权限,
4表示可读权限,这些值之和便可用来设立特定权限。
所以数字属性的格式应为3个0~7的八进制数,3个数表示的次序为u、g和o。
4.什么过滤操作?
在Linux中如何实现?
答:
过滤操作:
将一个命令(程序)的输出作为另一个命令(程序)的输入
Linux实现的命令格式:
命令丨命令
5.在Linux中挂载u盘并能显示其文档的中文信息,所使用的挂载命令是:
mount/dev/sda1/mnt/sub。
6.什么是vi?
其三种操作模式的含义是什么?
给出三种工作模式间的转换图。
vi有3种基本工作模式:
命令模式(CommandMode):
vi启动后的默认模式,控制光标的移动、复制删除文字、进入输入模式和末行模式
输入模式(InsertMode):
进行文字输入
末行模式(LastLineMode):
保存文件、退出vi
图示三种工作模式转换图。
三、实验内容(包含实验所用命令或相关程序源代码)
1.shell操作命令(给出每题所用的Shell命令或命令结果)
(1)创建名为stu1、stu2的2个用户,设置密码分别为student1和student2,并将它们设为组group1中的成员。
答
#Groupaddgroup1
#Useraddstu1–ggroup1
#Useraddstu2–ggroup1
$Passwdstu1
Student1
Student1
$Passwdstu2
Student2
Student0
(2)在每个用户的主目录下建立2个目录,分别命名为dir1和dir2。
答
#Sustu1
$Cd
$Mkdirdir1
$Mkdirdir2
$Exit
#Sustu2
$Cd
$Mkdirdir1
$Mkdirdir2
(3)查找stu1用户主目录、下属各子目录的默认存取权限,并给出结论。
答
#Sustu1
$Cd
$Ls-l
(4)调试pwd和cd命令,回答下列关于Linux文件系统中目录的有关问题。
用户主目录的绝对路径如何表示?
/home/stu1/home/stu2
根目录如何表示?
/root
.和..分别表示什么目录?
子目录父母目录
~表示什么目录?
主目录
⑤当前目录如何表示?
Cd
(5)新建用户stu3,设置其密码为student3,并将其设置为group2中成员。
尔后,以stu3登录,在其主目录下建立名为text的目录,在text目录下再建立名为dir1的子目录,并使其成为当前目录。
答
#Groupaddgroup2
$Useraddstu3–ggroup2
$Passwdstu3
Student3
Student3
#Sustu3
$Cd
$Cdtext
$Mkdirdir1
$Cddir1
(6)使用cat>sneakers.txt命令,分析命令行catsneakers.txt的显示结果。
$cat>sneakers.txt
buysomesneakers
thengotothecoffeeshop
thenbuysomecoff
^D
$catsneakers.txt
答$cat>sneakers.txt
buysomesneakers
thengotothecoffeeshop
thenbuysomecoff
ctrlD
(7)使用上题的方法,在dir1目录中建立home.txt文件,其内容为:
bringthecoffeehome
takeoffshoes
putonsneakers
makesomecoffee
relax!
答
$Exit
#Sustu1
$Cd
$Cddir1
$Cat>home.txt
bringthecoffeehome
takeoffshoes
putonsneakers
makesomecoffee
relax!
CtrlD
(8)试写出实现下列功能的shell命令:
将home.txt文件移至其上级目录中(即text目录下)。
答$exit
#Sustu1
$Cd/home/stu1/dir1
$Mr/home/stu1/dir1/home.txt./home/stu1
将home.txt添加到sneakers.txt尾部形成新的文件saturday.txt。
答$exit
#Sustu1
$Cd/home/stu1
$Catsneakers.txt>Saturday.txt
$Cathome.txt>>Saturday.txt
将text目录树从stu3用户主目录下移至stu2主目录下。
【使用特权用户方法】
su
mv/home/stu3/text/home/stu2
【修改目录权限方法】
将Saturday.txt文件从stu2目录中复制到stu1目录中。
#cp/home/stu1/saturday.txt/home/stu2
(9)试画出上述命令后,用户stu1、stu2和stu3主目录中的目录树(3棵子树)。
2.LinuxC程序开发
(1)编写LinuxC程序,把一个文件的内容复制到另一个文件中,即实现简单的copy功能。
要求:
程序输入的第一个参数是源文件,第二个参数是目标文件。
【源程序】
#include
#include
intmain(intargc,char*argv[])
{
FILE*in,*out;
charch;
if(argc!
=3)
{
printf(“Youforgottoenterafilename\n”);
exit(0);
}
if((in=fopen(argv[1],“r”))==NULL)
{
printf(“cannotopeninfile\n”);
exit(0);
}
if((out=fopen(argv[2],“w”))==NULL)
{
printf(“cannotopenoutfile\n”);
exit(0);
}
while(!
feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);
【运行命令】
#gcc–otestcopy.c
#./testfile1.cfile2.c
(2)编写LinuxC程序,列出stu2主目录中的文件信息,并将其中saturday.txt文件的权限设置为文件所有者可读可写、同组用户只读、其他用户无权限。
【源程序】
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
DIR*dp;
structdirent*dirp;
intn=0;
if(argc!
=2)
{
printf(“asingleargmentisrequired”);
exit(0);
}
if((dp=opendir(argv[1]))==NULL)
{
printf(“cannotopen%s”,argv[1]);
exit(0);
}
while(((dirp=readdir(dp))!
=NULL)&&(n<=50))
{
if(n%1==0)printf(“”);
n++;
printf(“%10s\n”,dirp->d_name);
}
system(“chmod640/home/stu2/text/dir1/saturday.txt”);
}
【运行命令】
#gcc–otestlist.c
#./test/home/stu2
实验名称:
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)echopersonperson
2)echo$personjenny
3)echo‘$person’$person
4)echo“$person”jenny
(2)填充下列与环境变量、位置变量和预定义变量相关的表格。
Shell变量
定义
HOME
用于保存用户注册目录的绝对路径
PATH
保存用冒号分隔的目录路径,shell将按PATH变量中给出的顺序搜索这些目录,找到第一个与命令名一致的可执行文件将被执行。
PWD
当前工作目录的绝对路径名,该变量取值随cd命令的使用而变化。
PS1
主提示符,默认特权用户为#,普通用户为$。
$0
表示当前shell程序的文件名。
$#
表示位置参数的个数。
$?
前一命令执行后返回的状态。
$$
当前进程的pid。
3.写出下列expr命令的输出:
(1)exprindex“value”‘a’
(2)expr“value”:
‘v.*u’
(3)expr“aaa”:
‘a\+’
(4)expr“aaa”:
‘a\?
’
(5)expr2+3
(6)expr2+3
(7)expr2\*3
(8)expr5+`expr2+3`
(9)exprlength“operatingsystem”
(10)exprsubstrlinux23
答:
(1)2
(2)4(3)3(4)1(5)2+3(6)5
(7)6(8)non-numericargument(9)16(10)inu
三、实验内容
1.编写Shell脚本,从命令行中接收一个二元算术表达式并计算其结果。
【源程序】
#!
/bin/bash
iftest$#=3
then
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
【运行】
chmoda+xjisuan
./jisuan2+3
2.编写一个以文件列表作为输入的过滤器程序,要求文件名含有以句点“.”分隔的后缀,过滤器输出每个文件的不带句点和后缀的文件名。
【源程序】
readflag
whiletest“$flag”!
=“#”#输入的文件列表以井号结束
do
location=`expr“$flag”:
“.*\.”`
location=`expr$location–1`
basename=`exprsubstr“$flag”1$location`
echo$basename
readflag
done
【运行】
chmoda+xletter
./letter
3.将下面的shell脚本命名为myscript,分析其功能:
count=$#
cmd=echo
while[$count–gt0]
do
cmd="$cmd\$$count"
count=`expr$count-1`
done
eval$cmd
【命令行输入】
chmoda+xmyscript
./myscriptfirstsecondthird
【运行结果】
答:
thirdsecondfirst
【脚本功能分析】
答:
将命令输入的参数倒序显示
4.设计一个程序cuts,它从标准输入读入数据,获取由第一个参数n和第二个参数m所限定范围的数据(包括这两个字符),n和m都是整数。
例如:
$cuts1114
Thisisatestofcutsprogram(输入)
test(显示结果)
【源程序】
答
#!
/bin/bash
readaline
echo$aline|cut–c$1-$2
实验名称:
进程控制与通信
实验时间:
年月日第周星期
一、实验目的
1.加深进程概念的理解,体会进程创建过程,进一步认识进程的异步并发特征。
2.了解Linux系统中,进程通信的基本原理,重点掌握进程的信号通信和管道通信机制。
3.掌握Linux系统中,与进程控制和进程通信相关的系统调用。
二、实验预习(预备知识的问题及回答)
1.写出下列系统调用功能:
(1)fork()用于创建进程
(2)getpid()用于获取当前进程id号
(3)wait()用于等待子进程结束
(4)exit()用于进程自我终止
(5)pipe()用于创建无名管道
(6)signal()用于在信号与信号处理函数之间创建对应关系
(7)kill()用于发送信号给制定进程
2.阅读fork系统调用,用伪码写出其实现流程。
答
pid=fork()
ifpid为负
printfork调用失败
elseifpid为0
print当前进程是子进程
elsepid为正
print当前进程是父进程
3.图示pipe系统调用生成无名管道时所涉及的数据结构。
4.在UNIX系统中运行下面程序,最多可以产生多少个进程?
画出进程家族树。
main()
{fork();
fork();
fork();
}
答:
最多可以产生8个进程
5.下列程序运行后,a的值是多少?
main()
{inta,pid;
a=55;
pid=fork();
if (pid< 0) { printf("error in fork!
");exit(0);}
elseif(pid==0){sleep(5);a=99;printf(“a=%d\n”,a);sleep(5);exit(0);}
else{sleep(7);
printf(“a=%d\n”,a);
wait(0);
}
}
答:
程序的运行结果为a=99,a=55;最终a=55
三、实验内容
1.调试下面的程序,观察可能的并发结果,给出简要分析,并画出进程家族树。
#include
#include
#include
main ()
{intstatus;
int pid1=-1,pid2=-1,pid3=-1;
pid1=fork();
if (pid1 == 0)
printf("pid1=0,my process id is %d\n",getpid());
else if (pid1 > 0)
{printf("pid1>0,my process id is %d\n",getpid());
pid2=fork();
if (pid2 == 0)
printf("pid2=0,my process id is %d\n",getpid());
else if (pid2 > 0)
printf(" pid2>0,my process id is %d\n",getpid());
}
pid3=fork();
if (pid3 == 0)
printf("pid3=0,pid1=%d,pid2=%d, my process id is %d\n",pid1,pid2,getpid());
else if (pid3 > 0)
printf("pid3>0,pid1=%d,pid2=%d,my process id is%d\n",pid1,pid2,getpid());
wait(&status);
exit(0);
}
答:
可能情况1:
pid1=0,myprocessIDis3937
pid1>0,myprocessIDis3936
pid2=0,myprocessIDis3939
pid2>0,myprocessIDis3936
pid3=0,pid1=3937,pid2=3939,myprocessIDis3941
pid3>0,pid1=3937,pid2=3939,myprocessIDis3936
pid3=0,pid1=0,pid2=-1,myprocessIDis3938
pid3>0,pid1=0,pid2=-1,myprocessIDis3937
pid3=0,pid1=3937,pid2=0,myprocessIDis3940
pid3>0,pid1=3937,pid2=0,myprocessIDis3939
可能情况2:
pid1=0,myprocessIDis3937
pid3=0,pid1=0,pid2=-1,myprocessIDis3938
pid3>0,pid1=0,pid2=-1,myprocessIDis3937
pid1>0,myprocessIDis3936
pid2=0,myprocessIDis3939
pid2>0,myprocessIDis3936
pid3=0,pid1=3937,pid2=3939,myprocessIDis3941
pid3>0,pid1=3937,pid2=3939,myprocessIDis3936
pid3=0,pid1=3937,pid2=0,myprocessIDis3940
pid3>0,pid1=3937,pid2=0,myprocessIDis3939
进程家族树为:
2.编程实现进程间管道通信。
要求:
父子进程共享一无名管道,两个子进程作为发送方分别向管道发送一行信息,父进程先读出子进程P1发来的信息行,将其转换为大写字母输出;再读出子进程P2发来的信息行,将其转换为小写字母输出。
【源程序】
答:
#include
#include
#include
#include
#include
intfiledes[2];
charbuffer[80];
main()
{
pipe(filedes);
charstr1[80];
charstr2[80];
intpid1,pid2,i;
while((pid1=fork())==-1);
if(pid1==0)
{
lockf(filedes[1],1,0);
printf("child1inputstring1\n");
scanf("%s",str1);
write(filedes[1],str1,sizeof(str1));
lockf(filedes[1],0,0);
exit(0);
}
else{
while((pid2=fork())==-1);
if(pid2==0)
{
lockf(filedes[1],1,0);
printf("child2inputstring2\n");
scanf("%s",str2);
write(filedes[1],str2,sizeof(str2));
l