操作系统原理实验报告Word下载.doc
《操作系统原理实验报告Word下载.doc》由会员分享,可在线阅读,更多相关《操作系统原理实验报告Word下载.doc(29页珍藏版)》请在冰点文库上搜索。
![操作系统原理实验报告Word下载.doc](https://file1.bingdoc.com/fileroot1/2023-4/28/9d911396-4585-4250-98f7-59f584c32f70/9d911396-4585-4250-98f7-59f584c32f701.gif)
6.什么是vi?
其三种操作模式的含义是什么?
给出三种工作模式间的转换图。
命令模式:
vi启动后的默认模式,控制光标的移动,复制删除文字,进入输入模式和末行模式
输入模式:
进行文字输入
末行模式:
保存文件,退出VI
三、实验内容(包含实验所用命令或相关程序源代码)
1.shell操作命令(给出每题所用的Shell命令或命令结果)
(1)创建名为stu1、stu2的2个用户,设置密码分别为student1和student2,并将它们设为组group1中的成员。
#groupaddgroup1
#useraddstu1–ggroup1
#sustu1
Spasswdstu1回车后敲入密码student1
$exit
#useraddstud2–ggroup1
#sustu2
$passwdstu2
(2)在每个用户的主目录下建立2个目录,分别命名为dir1和dir2。
$cd~
$mkdirdir1
$cd~
$mkdirdir2
(3)查找stu1用户主目录、下属各子目录的默认存取权限,并给出结论。
$cd..
$ls-1
用户主目录权限为:
drwx--------,即目录的用户可读,写,执行,同组和其它的用户无任何权限
#sustu`
$ls-1
Dir1目录权限为:
drwxr-xr-x,即目录的用户可读,写,执行
(4)调试pwd和cd命令,回答下列关于Linux文件系统中目录的有关问题。
①用户主目录的绝对路径如何表示?
/home/stu1/home/stu2
②根目录如何表示?
/root
③.和..分别表示什么目录?
子目录,父目录
④~表示什么目录?
用户主目录
⑤当前目录如何表示?
Cd~
(5)新建用户stu3,设置其密码为student3,并将其设置为group2中成员。
尔后,以stu3登录,在其主目录下建立名为text的目录,在text目录下再建立名为dir1的子目录,并使其成为当前目录。
#groupaddgroup2
#useraddstu3–ggroup2
#sustu3
$passwd回车后敲入密码student3
$mkdirtext
$cdtext/dir1
(6)使用cat>
sneakers.txt命令,分析命令行catsneakers.txt的显示结果。
$cat>
sneakers.txt
buysomesneakers
thengotothecoffeeshop
thenbuysomecoff
^D
$catsneakers.txt
从键盘中创建一个名为sncakers.txt文件,文件内容为:
buysomesncakers
Thengotothecoffeeshop
Thenbuysomecoff
(7)使用上题的方法,在dir1目录中建立home.txt文件,其内容为:
bringthecoffeehome
takeoffshoes
putonsneakers
makesomecoffee
relax!
$cd/home/stu1/dir1
$cat>
home.txt
Bringthecoffeehome
Takeoffshoes
Putonsneakers
Makesomecoffee
Relax!
[ctrl+d]
(8)试写出实现下列功能的shell命令:
①将home.txt文件移至其上级目录中(即text目录下)。
$mv/home.txt
②将home.txt添加到sneakers.txt尾部形成新的文件saturday.txt。
$catcneakers.txt>
asturday.txt
$cathome.txt>
>
Saturday.txt
③将text目录树从stu3用户主目录下移至stu2主目录下。
【使用特权用户方法】
su
mv/home/stu3/text/home/stu2
【修改目录权限方法】
#cp/home/stu3/text/home/stu2
(9)试画出上述命令后,用户stu1、stu2和stu3主目录中的目录树(3棵子树)。
2.LinuxC程序开发
(1)编写LinuxC程序,把一个文件的内容复制到另一个文件中,即实现简单的copy功能。
要求:
程序输入的第一个参数是源文件,第二个参数是目标文件。
【源程序】
#include<
sys/types.h>
dirent.h>
stdio.h>
crrno.h>
Intmain(intargc,char*argv[])
{
FILE*in,*out;
Charch;
If(argc!
=3)
Printf(“youforgottoenterafilename\n”);
Exit(0);
}
If(in=fopen(argv[1],”r”))==NULL
Printf(“cannitopenoutfile\n”);
If(out=fopen(argv[2],”w”))==NULL
Prntf(“cannotopenoutfile”);
Exit(0);
While(!
feof(in))fputc(in),out);
Fclose(in);
Fclose(out);
【运行命令】
#gcc–otestcopy.c
#./testfile1.cfile2.c
(2)编写LinuxC程序,列出stu2主目录中的文件信息,并将其中saturday.txt文件的权限设置为文件所有者可读可写、同组用户只读、其他用户无权限。
DIR*dp;
Structdirent*dirp;
Intn=0;
If(arge!
=2)
{
Printf(“asignleargementisrequired”);
If(dp=opendir(argv[1])==NULL)
Printf(“cannotopen%s”,args[1]);
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程序设计
2014年4月16日第9周星期三
熟悉SHELL脚本编程的步骤,掌握基于Bash的Shell脚本开发。
1.Linux系统默认的shell语言是什么?
欲查看该shell的版本,应使用什么命令?
Bashshell
$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
保存用冒号分割的目录路径
PWD
当前工作目录的据对路径名
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
24312+3
56mon-numericargument16inu
三、实验内容
1.编写Shell脚本,从命令行中接收一个二元算术表达式并计算其结果。
#!
/bin/bash
Iftest$#=3
Then
Cases2in
+)letz=$1+$3;
;
-)letz=$1-$3;
/)letz=$1/$3;
x|x)letz=$1*$3;
*)echo”warning-$2invalidoperator!
”exit;
Esac
Echo”answerissz”
Else
Echo”usage-$0value1operatorvalue2”
fi
【运行】
Chmoda+xjisuan
./jisuan2+3
2.编写一个以文件列表作为输入的过滤器程序,要求文件名含有以句点“.”分隔的后缀,过滤器输出每个文件的不带句点和后缀的文件名。
Readflag
Whiletest“$flag”
Do
Location=’expr$location=1’
Basename=’exprsubstr=”$flag”1$location’
Echo$basecname
done
Chmoda+xletter
./letter
3.将下面的shell脚本命名为myscript,分析其功能:
count=$#
cmd=echo
while[$count–gt0]
do
cmd="
$cmd\$$count"
count=`expr$count-1`
eval$cmd
【命令行输入】
chmoda+xmyscript
./myscriptfirstsecondthird
【运行结果】
Thirdsecondfirst
【脚本功能分析】
将命令行输入的参数倒叙显示
4.设计一个程序cuts,它从标准输入读入数据,获取由第一个参数n和第二个参数m所限定范围的数据(包括这两个字符),n和m都是整数。
例如:
$cuts1114
Thisisatestofcutsprogram(输入)
test(显示结果)
Readbline
Echo$aline|cut-c$1-$2
进程控制与通信
2014年4月30日第11周星期三
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为负
Print当前进程是子进程
Elseifpid为0
Print当前进程是父进程
3.图示pipe系统调用生成无名管道时所涉及的数据结构。
4.在UNIX系统中运行下面程序,最多可以产生多少个进程?
画出进程家族树。
main()
{fork();
fork();
8个
5.下列程序运行后,a的值是多少?
{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=99a=55;
最终a=55
三、实验内容
1.调试下面的程序,观察可能的并发结果,给出简要分析,并画出进程家族树。
#include
<
unistd.h>
sys/wait.h>
main
()
{intstatus;
int
pid1=-1,pid2=-1,pid3=-1;
pid1=fork();
(pid1
==
0)
pid1=0,my
process
id
is
%d\n"
getpid());
else
0)
{printf("
pid1>
0,my
pid2=fork();
(pid2
pid2=0,my
else
0)
pid2>
0,my
}
pid3=fork();
(pid3
pid3=0,pid1=%d,pid2=%d,
my
pid1,pid2,getpid());
pid3>
0,pid1=%d,pid2=%d,my
is%d\n"
wait(&
status);
exit(0);
2.编程实现进程间管道通信。
要求:
父子进程共享一无名管道,两个子进程作为发送方分别向管道发送一行信息,父进程先读出子进程P1发来的信息行,将其转换为大写字母输出;
再读出子进程P2发来的信息行,将其转换为小写字母输出。
【源程序】
Intfiledes[2];
Charbuffer[80];
Main()
Pipe(filedes);
Charstr1[80];
Charstr2[80];
Intpid1,pid2,I;
While((pid=fork())==-1);
If(pid1==0)
Lockf(filedes[1],1,0);
Printf(“child1inputString1\n”);
Scanf(“%s”,str1);
Write(filedes[1],str,sizeof(str1));
Lockf(filedes[1],0,0);
Else{
While((pid=fork())==-1)
If(pid2==0)
Lockf(filedes[1],1,0)
Printf(“child2inputstring2\n”);
Scanf(“%s”,str2);
Write(filedes[1],str2,sizeof(stru2));
Lockf(fildes[1],0,0);
If(waitpid(pid1,null,0)==pid1){
Read(filedes[0],buffer,80);
For(i=0;
i<
sizeof(str1);
i++)buffer[i]=toupper(buffer[i]);
Printf(“parent==child1:
%s\n”,buffer);
Print