操作系统实验报告 linux部分原创.docx

上传人:b****6 文档编号:8016872 上传时间:2023-01-28 格式:DOCX 页数:28 大小:35.73KB
下载 相关 举报
操作系统实验报告 linux部分原创.docx_第1页
第1页 / 共28页
操作系统实验报告 linux部分原创.docx_第2页
第2页 / 共28页
操作系统实验报告 linux部分原创.docx_第3页
第3页 / 共28页
操作系统实验报告 linux部分原创.docx_第4页
第4页 / 共28页
操作系统实验报告 linux部分原创.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

操作系统实验报告 linux部分原创.docx

《操作系统实验报告 linux部分原创.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告 linux部分原创.docx(28页珍藏版)》请在冰豆网上搜索。

操作系统实验报告 linux部分原创.docx

操作系统实验报告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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1