操作系统实验报告 linux部分原创.docx
《操作系统实验报告 linux部分原创.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告 linux部分原创.docx(28页珍藏版)》请在冰豆网上搜索。
操作系统实验报告linux部分原创
操作系统实验报告
(Linux部分)
班级:
姓名:
2.3Linux并发程序设计
(实验估计时间:
90分钟)
Ø背景知识
Ø实验目的
Ø工具/准备工作
Ø实验内容与步骤
背景知识
管道是Linux中最常用的进程间通信IPC机制。
利用管道时,一个进程的输出可成为另外一个进程的输入。
当输入输出的数据量特别大时,这种IPC机制非常有用。
可以想象,如果没有管道机制,而必须利用文件传递大量数据时,会造成许多空间和时间上的浪费。
在Linux中,通过将两个file结构指向同一个临时的索引节点,而两个索引节点又指向同一个物理页而实现管道。
实验目的
1)通过在Linux进程之间进行的通信实例来学习并发程序设计的方法。
2)通过Linux进程通信的程序设计与实现,进一步熟悉操作系统的进程概念,理解Linux进程管理概念。
3)通过阅读和分析Linux实验程序,学习Linux程序设计、调试和运行的方法。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
需要准备一台运行Linux操作系统的计算机。
实验内容与步骤
并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。
本实验中的并发程序例子完成两个程序child和father之间的数据传递工作,具体做法分为四步。
步骤1:
编制并发程序pipeline.c。
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为pipeline.c。
在该程序中定义管道和文件描述符,并且创建子进程child。
该程序用到的系统调用有pipe()、dup()、fork()、close、execl()、exit,它们的功能分别是建立管道、复制文件描述符、创建进程并使子进程与父进程有相同的程序正文、关闭文件描述符、用指定文件覆盖调用程序、撤销当前进程。
清单4-5pipeline.c
//定义管道程序
#defineSTD_INPUT0//定义标准输入设备描述符
#defineSTD_OUTPUT1//定义标准输出设备描述符
intfd[2];
main()
{
staticcharprocess1[]="father",process2[]="child";
pipe(fd);//定义管道
pipeline(process1,process2);//调用自定义函数pipeline()
pipeline();
exit
(1);//程序结束
}
pipeline(char*process1,char*process2)
{
inti;
while((i=fork())==-1);//创建进程,直到创建成功为止
if(i)
{
close(fd[0]);//关闭管道输入描述符
close(STD_OUTPUT);//关闭标准输出描述符1
dup(fd[1]);//指定标准输出描述符1为管道写指针
close(fd[1]);//关闭原始管道写指针
execl(process1,process1,0);//用程序father覆盖当前程序
printf("fatherfailed.\n");//execl()执行失败
}
else
{
close(fd[1]);//关闭管道输出描述符
close(STD_INPUT);//关闭标准输入描述符0
dup(fd[0]);//指定标准输入描述符0为管道读指针
close(fd[0]);//关闭原始管道读指针
execl(process2,process2,0);//用程序child覆盖当前程序
printf("childfailed.\n");//execl()执行失败
}
exit
(2);//程序结束
}
步骤2:
编制“管道写”程序father.c作为父进程的一部分工作。
其内容如下:
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为father.c。
清单4-6father.c
main()
{
staticcharstring[]=“Parentisusingpipewrite.”;
intlen;
len=sizeof(string);
write(l,string,len);/*将string中的内容写入管道中*/
printf(“parent,parent,parent\n\n\n”);
exit(0);
}
步骤3:
编制“管道读”程序child.c作为子进程的一部分工作。
其内容如下:
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为child.c。
清单4-7child.c
main()
{
charoutput[30];
read(0,output,30);/*从管道中读数据并存入output中*/
printf(“%s\nchild,child.\n”,output);
return(0);
}
步骤4:
编译。
Gcc–gpipeline.c–opipeline
Gcc–gfather.c–ofather
Gcc–gchild.c–ochild
步骤5:
运行。
./pipeline./father./child
若运行不成功,则应该用文本编辑器对源程序进行修改调试。
运行显示结果为:
childfailed.断开的管道
Parentisusingpipewrite.parent,parent,parent
输入的字符child,child.
2.4Linux重定向和管道
(实验估计时间:
90分钟)
Ø背景知识
Ø实验目的
Ø工具/准备工作
Ø实验内容与步骤
Ø可选练习
背景知识
在本实验中,我们将使用高级Linux命令来完成重定向和管道。
每一个Linux命令都有一个源作为标准输入,一个目的作为标准输出。
命令的输入通常来自键盘(尽管它也可以来自文件)。
命令通常输出到监视器或者屏幕上。
Linux计算环境使用重定向可以控制命令的I/O。
当试图把命令的输出保存到一个文件,以供以后查看的时候是很有用的。
通过管道,可以取得一个命令的输出,把它作为另一个命令的进一步处理的输入。
有几个元字符可用于输入/输出重定向符号:
输出重定向使用右尖括号(>,又称大于号);输入重定向使用左尖括号(<,又称小于号);出错输出重定向使用右尖括号之前有一个数字2(如2>)。
本实验重点在输出重定向。
重定向命令的格式是:
CommandRedirection-SymbolFile(textfileordevicefile)
标准输出比标准输入或标准出错更经常被重定向。
许多命令,如ls、cat、head和tail产生标准输出到屏幕上,常常会希望把这个输出重定向到一个文件中,以便将来查看、处理或者打印。
通过替换文件名,可以截获命令的输出,而不是让它到达默认的监视器上。
最强大的元字符之一是管道符号(|)。
管道取得一个命令的标准输出,把它作为标准输入传递给下一个命令(通常为more命令、lp(行式打印机)命令或者一个文件处理命令,如grep或sort)。
必须在管道的每边都有一个命令,命令和管道之间的空格是可选的。
管道命令的格式是:
command|command
实验目的
通过重定向和管道操作:
1)熟悉输入/输出(I/O)重定向;
2)把标准输出重定向创建一个文件;
3)防止使用重定向的时候覆盖文件;
4)把输出追加到一个现有的文件中;
5)把一个命令的输出导入到另一个命令中。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
您需要做以下准备:
1)由指导老师分配的登录用户名(如user2)和口令。
2)一台运行RedHatLinux操作系统,带有GNOME的计算机。
实验内容与步骤
1.使用重定向标准输出符号
2.使用管道符号
在本实验中将会用到下列命令:
pwd:
显示当前的工作路径。
cd:
改变目录路径。
ls:
显示指定目录的内容。
more:
分页显示文件的内容。
这是用于显示文本文件的首选方法。
head:
截取显示文件的开头部分(默认为开头10行)。
tail:
截取显示文件的结尾部分(默认为最后10行)。
cal:
有关日历的命令。
set:
shell特性的设置。
echo:
显示变量的值。
ps:
显示当前进程。
data:
显示或设置系统日期和时间。
grep:
查找文件中有无指定的关键字。
提示:
如果对命令的格式不清楚,可以用man命令请求帮助,即:
manmore
步骤1:
开机,登录进入GNOME。
在GNOME登录框中填写指导老师分配的用户名和口令并登录。
步骤2:
访问命令行。
单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开终端窗口。
1.使用重定向标准输出符号
步骤3:
重定向标准输出,创建一个文件。
右尖括号或称大于符号(>)把命令的输出发送到一个文件中:
使用单个右尖括号,当指定文件名不存在的时候,将创建一个新文件;如果文件名存在,它将被覆盖。
(注意:
命令、重定向符号和文件名之间的空格是可选的)。
重定向标准输出命令的格式是:
command>file
1)为核实当前所在目录位置,使用什么命令?
pwd
如果当前位置不在主目录中,使用什么命令可以改变到主目录中?
cd
2)如果希望把文件和目录列表截获,存储为主目录中的一个文件,这样可以追踪主目录中有什么文件。
使用什么命令,把长文件列表的输出重定向,创建一个叫做homedir.list的文件。
ls>homedir.list
3)新文件homedir.list被放在哪里?
/home/student
使用ls命令核实新文件存在。
4)使用什么命令,以一次一屏的方式,来查看刚才创建的文件内容?
ls–l|morehomedir.list
5)使用head命令截获homedir.list文件的前10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。
应该使用什么命令?
head-10homedir.list>dhomedir.list-top-10
使用more命令查看文件的内容。
6)使用tail命令,截获homedir.list文件的最后10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。
使用什么命令?
tail-10homedir.list>dhomedir.list-top-10
使用more命令查看文件的内容。
7)截获cal-y命令的输出,把它存到名为calendar的文件中。
查看文件的内容。
截获了什么
cal–y>calendar|morecalendar
截获了2011年12个月的日历
8)截获cal2010命令的输出,把它存到名为calendar的文件中。
查看文件的内容。
其中有什么内容?
cal2010>calendar|morecalendar
日历有什么变化?
日历的内容变成2010年的了
步骤4:
防止使用重定向的时候覆盖文件。
在bashshell中,一个叫做noclobber的选项可以用来设定防止在重定向的过程中覆盖文件。
可以在命令行中使用$set-onoclobber命令来完成。
o代表选项。
为了重新激活clobber特性,使用$set-onoclobber;撤消则用set+onoclobber。
如果你使用的是cshshell,为了激活/撤消Cshell中的clobber特性,使用setnoclobber和unsetnoclobber。
1)输入命令,打开shell中的noclobber选项。
输入什么命令?
set–onoclobber
2)输入命令ls-l>homedir.list,结果是什么?
bash:
homedir.list:
cannotoverwriteexistingfile
3)输入命令ls-l>homedir.list2,结果是什么?
出现了一个新的名为homedir.list2的文件
步骤5:
向现有的文件追加输出。
如果想向一个现有的文件追加(添加到末尾)文本而不是覆盖它,可以使用双右尖括号(>>)。
这个选项当文件不存在的时候,会创建一个新文件,或者追加到已有文件。
追加命令的格式是:
command>>file
1)输入命令,显示“HappyBday”一行字,使用重定向符号截获输出,把它存到叫做bday4me的文件中。
使用什么命令?
echo“HappyBday”>>bday4me
2)输入命令,显示一行字,使用双重定向符号,把输出追加到bday4me文件中。
查看bday4me文件的内容。
其中有什么?
echo“你好”>>bady4me
3)输入命令,显示您出生年月的日历(如果在1985年的6月出生,输入cal61985),使用双重定向符号,把输出追加到bday4me文件中。
使用什么命令?
Cal121989>>bady4me
4)查看bday4me文件的内容。
注意这3个命令的输出在bday4me文件中已经被组合起来了。
您是在一周中的哪一天出生的?
周五
2.使用管道符号
步骤6:
把命令的输出导入到另一个命令中。
1)使用管道元字符,发送ls-l命令的输出,作为more命令的输入(注意:
如果在当前目录中没有太多的文件,使用/etc目录获取长列表)。
把输出作为more命令的输入的时候,得到什么结果?
结果以一屏一次的方式显示在屏幕上
2)查看使用ls–l|more命令列出来的文件,注意创建或修改的日期。
为了查看在同一个月被创建或修改的文件或目录的列表,可以使用grep命令对那个月进行搜索。
当月份显示在列表中的时候,指定它(例如:
Oct)。
输入命令ls-1|grepOct(或者想查找的月份)。
结果是什么?
只显示10月份创建的目录
3)目录总是4096字节大小。
输入命令ls-1|grep4096。
产生的列表是什么?
4096字节大小的目录显示
4)可以使用多个管道连接多个命令。
输入取得长文件列表输出的命令,把它输入给tail命令,然后到sort命令。
输入的命令是:
ls–l|tail|sort
5)ps(进程状态)命令用于查看Linux系统中运行什么进程。
把ps-e命令的输出输入给more命令。
-e选项将给出每一个在系统中运行的进程。
把输出输入到more命令中的结果是什么?
系统中运行的所有程序
步骤7:
删除在本实验中创建的文件和目录。
步骤8:
关闭终端窗口,注销。
可选练习
1.使用set-o命令不指定任何选项,可以查看noclobber特性是否已经打开。
1)输入set-o。
noclobber特性打开还是关闭的?
如果它是关闭的,打开它。
使用什么命令?
关闭的;set–onoclobber
2)永久的关闭noclobber特性。
使用什么命令?
set+onoclobber
2.可以把管道和重定向组合起来使用,达到特殊的效果。
输入命令创建一个名为top5.list的文件,内容为主目录中的头5行记录,使用什么命令?
ls–l|head-5>top5.list
3.4管理Linux系统进程
(实验估计时间:
90分钟)
ØØ 背景知识
ØØ 实验目的
ØØ 工具/准备工作
ØØ 实验内容与步骤
背景知识
在本实验中,我们将使用Linux命令工作,来标识和控制系统进程。
Linux操作系统使用进程管理作业,进程由系统或者用户初始化。
用户在Linux环境下执行的作业大多数都会启动一个进程。
进程可以启动或者派生一个子进程,这样创建了一个进程层次结构或者进程树,类似于具有父子关系的文件系统层次结构。
可以使用ps(进程状态)命令工作,监控系统进程,使用kill命令终止不想要的进程。
实验目的
1)回顾系统进程的概念,加深对Linux/UNIX进程管理的理解。
2)回顾ps命令和选项。
3)列出当前shell中的进程。
4)列出运行在系统中的所有进程。
5)根据命令名搜索特定的进程。
6)确定一个进程,终止它。
7)使用kill命令终止进程。
8)根据用户查找和终止进程。
9)根据命令名终止进程。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
您需要做以下准备:
1)由指导老师分配的登录用户ID(如user2)和口令。
2)一台运行RedHatLinux操作系统的计算机。
实验内容与步骤
步骤1:
登录进入GNOME。
在Linux登录框中填写指导老师分配的用户名和口令,登录Linux系统。
步骤2:
访问命令行。
单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开“终端”窗口。
步骤3:
回顾系统进程概念。
每个运行的程序都会创建一个进程,进程分配到一个唯一的进程标识符(PID)。
PID被系统用于标识和跟踪进程,直到进程结束。
操作系统内核管理所有进程的初始化和终止。
每一个进程都要求系统资源(例如CPU时间和RAM空间)在其中工作。
当进程启动的时候,操作系统把系统资源分配给每个进程,当进程终止的时候,系统回收这些资源。
在Linux系统启动的时候,首先启动的两个进程是sched(调度)和init(初始化),它们管理着其他进程。
Linux系统中有几种不同类型的进程:
守护进程:
由Linux内核启动的进程,为了特定目的而存在。
例如,lpsched守护进程存在只是为了处理打印作业。
父进程:
派生其他进程的进程是父进程。
一个叫做init的守护进程是第一个调用的进程。
每一个进程,除了init之外,都有一个父进程。
子进程:
由其他进程派生出来的进程叫做子进程。
孤儿进程:
在进程返回输出之前,它的父进程结束了,这样的进程叫做孤儿进程。
僵进程:
子进程没有带着输出返回给父进程。
这样的进程在系统中变成丢失的进程。
使用此前的信息,完成以下填空:
1)Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的PID进程标识符,用于跟踪从进程启动到进程结束。
2)当启动新进程的时候,内核也给它们分配系统资源,如CPU时间和RAM空间。
3)永远不向父进程返回输出的进程叫做僵进程。
4)由父进程派生出来的进程叫做子进程。
5)父进程是一个派生另一个进程的进程。
6)运行用于提供服务的Linux系统进程是守护进程。
7)如果父进程在子进程之前结束,它创建了一个孤儿进程。
步骤4:
回顾ps命令和信息。
ps命令用于列出当前系统中运行的进程。
如果一个进程耗时太长,或者看上去好像已经终止了,表现为一个终端窗口不再响应或挂起,通常需要使用ps查看系统中的进程。
通过列出进程,可以查看初始化进程的命令或程序的名字,以及所有它派生出来的子进程。
通过多次执行ps命令,查看进程的时间——进程占用的CPU时间,可以检查一个进程是否还在运行。
如果时间小再增长,那么进程可能已经终止了。
如果进程占用太长的时间或者已经停止,可以使用ps命令检查进程的进程ID(PID),然后杀死进程。
ps命令的输出将显示PID号和与其相关的命令或程序。
PID号通常用于终止一个进程。
ps命令(ps[-options])的3个主要选项如下表所示。
表3-5ps命令选项
ps选项
意义
功能
Ps
无选项
显示当前shell或终端窗口中,当前用户的进程信息
ps–e
每一个
显示系统中每一个进程的信息
ps–f
完全
产生一个完全列表,给出每个进程的所有可用信息
ps-uuserid
用户
显示特定用户的所有进程
基本的ps命令显示在当前shell中的进程信息,用户只能够查看在这个终端窗口中初始化的进程。
输入ps命令,将结果填入表3-6中。
表3-6实验记录
PID
TTY
TIME
CMD
4894
pts/0
00:
00:
00
bash
4949
pts/0
00:
00:
00
ps
从当前终端窗口中,练习使用给出的每个选项的ps命令。
输入ps-f命令,显示运行在系统中的某个进程的完全信息,填入表3-7中。
表3-7实验记录
UID
PID
PPID
C
STIME
TTY
TIME
CMD
student
4894
4892
0
08:
09
pts/0
00:
00:
00
bash
student
4957
4894
0
08:
31
pts/0
00:
00:
00
ps-f
ps-f命令输出的各栏标题见表3-8所示。
表3-8ps-f栏标题
值
描述
UID
初始化进程的用户ID
PID
进程的进程标识号。
PID可以用来杀死进程
PPID
进程的父进程标识号
C
进程的优先级
STIME
进程的启动时间
TTY
控制进程终端的终端举型
TIME
进程使用的CPU时间的数量
CMD
命令名守护进程(执行的程序的名字)
步骤5:
列出系统中运行的所有进程。
输入ps-ef命令,显示运行在系统中的各个进程的完全信息。
执行该命令,并与ps–f命令的输出结果对照,一致吗?
有何不同?
不一致;ps–ef显示的信息内容要多于ps-f
注意分析当前终端窗口中的输出结果:
a.显示了多少个进程?
62个
b.进程ID的PID是什么?
进程的进程标示号
c.启动进程的命令(CMD)是什么?
sched
d.请观察,什么命令的PID号是1?
init
e.再次运行ps–ef命令,计算进程的数目:
62个
然后执行下列命令把输出结果输入到wc命令中:
manps|wc
第一个数字显示的是行的数目,也是进程的数目:
577
执行man