操作系统实验说明版.docx
《操作系统实验说明版.docx》由会员分享,可在线阅读,更多相关《操作系统实验说明版.docx(39页珍藏版)》请在冰豆网上搜索。
操作系统实验说明版
操作系统实验说明书
操作系统课程组
2008-10修订
实验内容:
LINUX系统通过全世界众多软件高手,特别是Linus本人的不懈努力,使Linux能支持多种硬件平台(X86、Alpha、PowerPC、SPARC、ARM),至今已发展成为主流操作系统的一员。
随着Linux的优良性能不断显现,IBM、Intel、Sun等不少商业科技巨头纷纷涉足Linux.
今天,操作系统正向着大型和微型两个不同的方向发展着。
大型系统的典型是分布式操作系统和集群操作系统,而微型系统的典型则是嵌入式操作系统。
应该说Linux为操作系统研究者提供了新理论、新方法、新技术的实践和验证平台,同时反过来促进了操作系统的不断发展,因而可以说Linux特别适合于操作系统课程的教学,在Linux上的实验主要分成3个部分
1.LINUX基本命令
2.LINUX下VI操作
3.VI下系统调用及进程通信等程序设计
实验(12学时)
一、 实验目的
通过实验,使学生加深对《操作系统》课程部分理论知识的理解,并了解当今流行的LINUX操作系统的操作命令,以及其下有关进程、线程的程序设计。
二、实验内容和学时安排
实验内容
课时
实验一
LINUX基本命令及vi下编程环境
3
实验二
LINUX下VI基本操作
3
实验三
进程/线程通信与程序设计
6
三、 实验内容
实验一LINUX基本命令及编程环境
1. 实验的基本目的
通过上机操作,了解linux操作系统的特点,及常用命令。
linux是一个分时、多用户、多任务的操作系统。
它具有精简的核心。
linux提供两种用户界面:
一种是交互命令,即用户在终端上通过使用命令交互调用核外程序;另一种是系统调用,即用户编写程序时通过使用C语言的函数调用来调用系统核心功能。
本实验熟悉Linux操作环境,及Linux各类命令基本操作的使用方法。
2.LINUX基本命令
命令
解释
用法
举例
ls
显示某一个目录下的内容(文件和目录)
用法:
ls或者ls目录
ls后为空时表示显示当面目录下的内容。
可以在ls后面加上所要查看的目录路径名称
ls
ls/
ls/home/
ls/etc/sysconf
ls-l
详细显示
用法:
ls–l或者ls–l目录
注:
l为字母,不是数字1。
ls-l
ls–l/home
ls-a
显示所有的文件
用法:
ls–a或者ls–a目录
以.开始的文件为隐藏文件,此时也会显示,其他情况下不显示
ls–a
ls–la/etc/
cp
复制文件
用法:
cp原文件目标文件
注:
文件可以加上路径名
cp/home/lion/test1/home/lion/test/test2
cp-r
复制整个目录
用法:
cp–r原目录目标目录
注:
目录下的所有文件都会复制
cp/home/lion/mjli/home/lion/test/mjli2
mv
移动文件或者目录
和cp用法类似,但是移动后,原文件或者目录不存在。
注:
移动目录时不用-r参数
mv/home/lion/test1/home/lion/test2
mv/home/lion/mjli/home/lion/mjli2
touch
创建文件
用法:
touch文件名
touch/home/lion/test1
mkdir
创建目录
用法:
mkdir目录名
touch/home/lion/mjli
rm
删除文件
用法:
rm文件名
rm/home/lion/test1
rm-r
删除目录
用法:
rm–r目录名
rm–r/home/lion/mjli2
rmdir
删除空的目录
用法:
rmdir目录名
注:
此目录必须为空,否则无法删除
rmdir/home/lion/mjli2
cd
改变目录路径
用法:
cd目录名
cd/etc
cd/home/lion
cd..
到上一层目录中
用法:
cd..
cd..
cd/
到根目录下
用法:
cd/
cd/
pwd
显示当前的目录路径
用法:
pwd
pwd
cat
查看文件内容
用法:
cat文件名
cat/home/lion/test1
可以没有文件名,表示接收键盘,以ctrl+C结束
more
查看较长内容的文件
用法:
more文件名
注:
在显示中,按空格键滚动一页,按回车键滚动一行,按q键退出
more/home/lion/test2
less
查看较长内容的文件
与more用法类似。
Pgup、Pgdown,y向上滚动一行
less/home/lion/test2
psaux
查看系统的进程
注意:
参数aux最好一起使用
psaux
w
显示在线用户信息
用法:
w
注:
比命令who的信息详细
w
who
top
显示系统任务信息,包括cpu、内存等
用法:
top
top
mesg
是否接受其他人的write信息
用法:
mesgy或者mesgn
注:
y为接受,n为不接受。
mesgy
mesgn
write
传送信息给其他用户
用法:
write用户或者write用户TTY。
注:
TTY用于有区别多个同样的用户,可由w命令来获取。
writelion
writelionpts/2
Ctrl+C退出
passwd
修改密码
用法:
passwd
注:
超级用户可修改其他用户密码,此时为passwd用户
passwd
du
显示目录下的各个文件的占用磁盘情况(包括子目录下文件)
用法:
du目录名
注:
无目录名时为当前目录
du
du/home/lion
du-s
显示目录下的所有文件的大小
用法:
du–s目录名
注:
无目录名时为当前目录
du–s
du–s/home/lion
date
显示系统日期和时间
用法:
date
date
uptime
显示系统运行时间
用法:
uptime
uptime
clear
清除当前屏幕
用法:
clear
clear
wc
统计文件,给出文件的行数、字数、字符数
用法:
wc文件名
wc/home/lion/test1
grep
过滤文本
和其他命令连用,如
ls|grepsring为只显示具有string的行
cat文件名|grepstring为只显示文件中具有string的行
ls–l|grepstring
cat/home/lion|grephehe
psaux|greptest1
grep–n
过滤文本,把所找到的行在行前加上行号列出
用户与grep类似,加上参数即可
ls–l|grep–nstring
psaux|grep-ntest1
grep–v
过滤文本,把不包含给定string的行列出
用户与grep类似,加上参数即可
ls–l|grep–vstring
psaux|grep–vtest1
grepstring-r
搜索文本
用法:
grepstring–r目录名
在给定目录下搜索所有文件中含有string的行
注:
也可加-n–v参数。
grepstring–r/
grephehe–r/home/lion
df
查看系统硬盘信息
用法:
df
df
free
查看系统内存信息
用法:
free
free
ping
查看与对方机器是否连接
用法:
pingIP地址或者域名
ping
ping202.38.64.1
echo
回应输入内容
用法:
echostring
注:
结果将显示string
echohello
echohehe
whoami
显示当前正在进行操作的用户名
用法:
whoami
whoami
exit
退出登录系统
用法:
exit
exit
ctrl+C
中止程序执行
用法:
ctrl+C
ctrl+C
ctrl+D
退出系统
用法:
ctrl+D
ctrl+D
chmod
详见下面说明
chmod为改变文件权限。
在linux中,一个文件上有可读(r)可写(w)可执行(x)三种模式,分别针对该文件的拥有者(onwer)、同组者(group),和其他人(other)。
一个文件如果改成可执行模式则系统就将其视为一个可执行文件,而一个目录的可执行模式代表使用者有进入该目录之权利。
chmod就是用来变更一些文件的模式,其使用方式如下:
chmod[-R]mode文件名
-R将所有子目录及文件改为你所要改成的模式。
其中模式即可以用数字表示也可以用字母表示,分别表示如下:
1)数字
按照拥有者、同组者、其他人的顺序,给出一个三位的数字,r为4,w为2,x为1,例如765第一个数字7表示拥有者具有r+w+x的权限(7=4+2+1),第二个数字6表示同组者具有r+w权限(6=4+2),第三个数字5表示其他人具有r+x权限(5=r+x)。
用法:
chmod765文件名
可将其中的数字更改为所需要的权限即可。
2)字母
用法:
chmod[ugo]+/-[rwx]文件名
例如:
chmodu+r/home/lion/test1
chmodug+rx/home/lion/mjli/
其中[]可以同时出现,其意义分别如下:
+或-
r
w
x
u
u+r,u-r表示拥有者拥有或者取消可读权限
同理
同理
g
g+r,g-r表示同组者拥有或者取消可读权限
同理
同理
o
o+r,o-r表示其他人拥有或者取消可读权限
同理
同理
*其他特别命令:
解释
>
输出由屏幕重定向到文件中,文件原来内容被清空
用法:
命令>文件名
注:
命令可以为以上的命令,文件名可有目录路径
ls–l>/home/lion/result
>>
输出由屏幕重定向到文件的末尾中,文件原来内容被保留
类似>,只是保留了原文件的内容。
ls–l>>/home/lion/result
<
输入重定向,由文件的内容代替键盘输入
用法:
命令<文件名
注:
命令可以为以上的命令,文件名可有目录路径
wc
|
连接两个命令(前一个命令的结果作为后一个命令的输入)
用法:
命令|命令
ls--help|more
ls|grephello
ls|wc
.
当前目录
用法:
./文件或者目录
ls./
cp/home/lion/mjli./test/
..
上一目录
用法:
../文件或者目录
cd..
cp../test1./home/lion/
&
命令作为后台命令执行
用户:
命令&
gw03test&
说明:
1)大部分命令带很多选项,大部分选项在字符前面带有“–”,只是命令不同,所具有的选项参数不同,可以通过man,或info命令查看全部选项及说明,:
q键退出
2)通配符*,?
:
*表示任意字符+任意个数;?
表示任意1个字符。
3)LINUX命令多达上百,本实验仅给出了一些常用的命令和举例选项供简单了解和练习。
需要更多的了解LINUX,可以到中国IT实验室上,或其它网站查询。
3.部分命令练习:
1)用pwd命令查看当前所在的目录。
2)用ls命令列出此目录下的文件和目录。
3)用-a选项列出此目录下包括隐藏文件在内的所有文件和目录,其命令为_____ls-a__。
4)用man命令查看ls命令的使用手册,其命令为:
_____。
5)在当前目录下,创建测试目录test,其命令为:
______。
6)利用ls命令列出文件和目录,确认test目录创建成功。
7)进入test目录,查看当前目录的命令为:
__cdtest____。
8)用cp命令复制系统文件/etc/profile到当前目录下,其命令为:
_______。
9)复制文件profile到一个新文件profile.bak,作为备份,其命令为:
___cpprofileprofile/bak______
10)用less命令分屏查看文件profile的内容,注意练习less命令的各个子命令,例如b、p、q等
11)用grep命令在profile文件中对关键字then进行查询,其命令为:
______
12)删除文件newfile,显示当前目录下文件列表,回到上层目录。
Rmnewfile
13)把一个文件filename移动到test目录下其命令为________。
13)显示当前目录下的文件和目录列表,确认移动成功。
14)进入test目录,显示目录中的文件列表。
15)显示当前目录下文件和目录列表,复制test目录为testbak作为备份。
16)删除test子目录下的所有文件,其命令为:
____________。
*任意选择其中8个(抄题,给出答案,即命令形式)作为实验报告部分。
实验二vi基本操作:
1.进入vi命令格式:
vi[选项][文件名…]
vifilename:
打开或新建文件,并将光标置于第一行首
vi+nfilename:
打开文件,并将光标置于第n行首
vi+filename:
打开文件,并将光标置于最后一行首
vi+/patternfilename:
打开文件,并将光标置于第一个与pattern匹配的串处
vi-rfilename:
在上次正用vi编辑时发生系统崩溃,恢复filename
vifilename....filename:
打开多个文件,依次进行编辑
2.vi的基本命令:
最后行模式
命令
解释
:
x
保存之后退出
:
wq
保存之后退出
:
w
保存文件,不退出
:
q
退出
:
q!
不存盘就退出
:
setnumber
在每行开始显示行数
命令模式
命令
解释
h,←
光标左移
j,↓
光标下移
k,↑
光标上移
L,→
光标右移
0(数字0)
d0
光标移到本行的开头
光标删到本行的开头
$
d$
光标移到本行的末尾
光标删到本行的末尾
a
在当前位置之后添加
i
在当前的位置前面插入
o
在当前行的下面建一个新行
O
在当前行的上面建一个新行
数字G
跳至第“数字”行(无数字时跳到文件末尾)
数字yy
复制多少行(无数字时复制光标行)
数字dd
删除多少行(无数字时删除光标行)
p
在当前行的下面粘贴
u
撤消上一次的命令操作(可撤销多次操作)
D
从光标位置删除到本行行末
x
删除当前字符
X
删除前一个字符
Ctrlf下移一屏,通常是24行
Ctrlb上移一屏,通常是24行
Ctrld下移半屏,通常是12行
Ctrlu上移半屏,通常是12行
[n]G光标移动到缓冲区中第n行(省略时,末行)的首非空白字符处
:
nu显示当前行
/字符串向后查询指定的字符串,光标定位到行首
?
字符串向前查询指定的字符串,光标定位到行首
3.vi的几种模式转换
Vi编辑器的三种工作模式之间的转换如图所示。
4.vi编辑C源程序后的编译:
gcc的基本用法
gcc[options][filenames.c]
GCC选项
GCC有超过100个的编译选项可用。
这些选项中的许多你可能永远都不会用到,但一些主要的选项将会频繁用到,最主要的是-o选项。
当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。
GCC同样有指定编译器处理多少的编译选项。
-c选项告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。
这个选项使用的非常频繁因为它使得编译多个C程序时速度更快并且更易于管理。
缺省时GCC建立的目标代码文件有一个.out的扩展名。
例1:
gcctest.c
这样将编译出一个名为a.out的程序;
例2:
gcc-orun.outcount.c
这样将编译出一个名为run.out的程序
注意:
当使用-o选项时,-o后必须跟一个可执行(后缀为.out)文件名。
5.vi编辑C源程序后的运行
运行可执行文件命令形式:
·/文件名(全称)
实验三程序设计
1. 进程的创建
实验的基本目的是通过对进程的创建、控制和通信的设计达到下述目的:
●加深对进程概念的理解,明确进程和程序的区别。
●进一步认识并发执行的概念,区别顺序执行和并发执行。
1)例子1-1.系统调用fork()
//#include
//#include
#include
main ()
{
pid_t(改为int) pid;/*pid_t是short类型*/
pid=fork();
if (pid < 0)
printf("error in fork!
");
else if (pid == 0)
printf("i am the child process, my process id is %d\n",getpid());
else
printf("i am the parent process, my
process id is %d\n",getpid());
}
2)例子1-2.系统调用fork()
#include
#include
main ()
{charch; pid_t(改为int) pid;
pid=fork();
if (pid < 0) printf("error in fork!
");
else
if (pid == 0){
while((ch=getchar())!
=‘c’)/*判断当前键入的是否为c*/
{printf("child processid is %d\n",getpid());
sleep
(1);}exit(pid);}
else
{while((ch=getchar())!
=‘p’)/*判断当前键入的是否为p*/
{printf("parent process id is %d\n",getpid());
sleep
(1);}exit(pid)可删掉或改为exit(getpid());}
}
*3)改动1)的源程序,在子进程执行部分再创建一个子子进程。
2. 通过管道的进程通信
实验的基本目的是通过进程的创建、管道的设置,实现进程间通过管道进行通信的目的,了解在LINUX下进程间通过管道通信的基本程序设计过程。
#include
intpipe(intp[2]);
如果正常,返回0,有错则返回-1.
pipe()把p[]与两个文件描述符紧密联系起来:
p[0]用于从管道读
p[1]用于向管道写
1)例子2-1.利用pipe()和fork()
#include
#include
#include
#include
#defineMSGSIZE16/*正文+空*/
char*msg1=“hello,world#1”;
char*msg2=“hello,world#2”;
char*msg3=“hello,world#3”;
intmain()
{charinbuf[MSGSIZE];
intp[2],i,pid;
if(pipe(p)<0)/*打开管道*/
{perror(“pipeerror!
”);/*无法打开一个管道错*/
exit
(1);}
if((pid=fork())<0){perror(“fork”);
exit
(2);}
if(pid>0)/*父进程*/
{close(p[0]);/*关闭读端(连接)*/
write(p[1],msg1,MSGSIZE);
write(p[1],msg2,MSGSIZE);
write(p[1],msg3,MSGSIZE);
wait((int*)0);什么意思?
}
if(pid==0)/*子进程*/
{close(p[1]);/*关闭写端*/
for(i=0;i<3;i++){
read(p[0],inbuf,MSGSIZE);
printf(“%s\n”,inbuf);
}
}
return0;
}
注意:
(1)图示:
关闭一个方向
(2)管道的大小(Size)
每个管道都有一个大小限制
通常大约为5k(5120)个字节
(3)写问题
●write()将被挂起(阻塞)
如果管道中无法存放正文(容量不够),可能在写的过程中发生阻塞
●如果向一个没有读连接的管道写,将返回-1,且errno被置成EPIPE.
errno是一个全局变量.
(4)读问题
read()将被阻塞
如果管道空,且有一个写连接开放,read()将返回0。
如果为空,且没有任何写连接,就此,读进程可以知道通信结束。
2)例子2-2.pipe()下的生产与消费者问题
#include"sys/types.h"
#include"sys/file.h"
#include"unistd.h"
charr_buf[4];//读缓冲
charw_buf[4];//写缓冲
intpipe_fd[2];
pid_tpid1,pid2;
intproducer(intid);
intconsumer(intid);
inti,pid,status;/*status用来表示进程退出的状态*/
main()
{if(pipe(pipe_fd)<0)
{printf("pipecreateerror\n");exit(-1);}
else{printf("pipeisc