中国地质大学江城学院
LINUX操作系统实验报告
姓 名
班级学号
指导教师 冯春华
2011 年 9 月 14 日
实验一 在LINUX下获取帮助、Shell实用功能
实验目的:
1、掌握字符界面下关机及重启的命令。
2、掌握LINUX下获取帮助信息的命令:man、help。
3、掌握LINUX中Shell的实用功能,命令行自动补全,命令历史记录,命令的排列、替换与别名,管道及输入输出重定向。
实验内容:
1、使用shutdown命令设定在30分钟之后关闭计算机。
2、使用命令“cat /etc/named.conf”设置为别名named,然后再取消别名。
3、使用echo命令和输出重定向创建文本文件/root/nn,内容是hello,然后再使用追加重定向输入内容为word。
4、使用管道方式分页显示/var目录下的内容。
5、使用cat显示文件/etc/passwd和/etc/shadow,只有正确显示第一个文件时才显示第二个文件。
实验步骤及结果:
1、
2、
3、
4、
5
实验二 文件和目录操作命令
实验目的:
1、 掌握LINUX下文件和目录的操作命令,如pwd、cd、ls、touch、mkdir、rmdir、cp、mv、rm等。
2、 掌握LINUX下建立链接文件的方法。
实验内容:
1、使用命令切换到/etc目录,并显示当前工作目录路径。
2、使用命令显示/root目录下所有文件目录的详细信息,包括隐藏文件。
3、使用命令创建空文件/root/ab,并将该文件的时间记录更改为8月8日8点8分。
4、使用命令创建具有默认权限为744的目录/root/ak,然后将/etc/named.conf文件复制到该目录中,最后将该目录及其目录下的文件一起删除。
5、统计文件/etc/named.conf的行数、字符数和单词数。
6、使用命令创建/root/a文件的硬链接文件/root/b和软链接文件/root/c。
实验步骤及结果:
1.
2 .
3
4
5
6
实验三 vi编辑器使用、文件显示和处理命令
实验目的:
1、 掌握vi编辑器的使用方法。
2、 掌握LINUX下文件显示和处理命令,如cat、more、less、head、tail、sort、uniq、cut等。
实验内容:
1、使用vi编辑器创建文本文件/root/v,文件内容为hell,最后保存退出。
2、使用命令一次3行显示文件/etc/named.conf文件内容。
3、查看文件/etc/passwd的前3行内容。
4、创建文件file1,文件内容有3行,分别为a、c、b,排序该文件数据,显示在屏幕上。
5、创建文件file2,文件内容有2行,分别为d、a,比较文件file1和file2文件内容。
实验步骤及结果:
1
2
3
4
5
实验四 LINUX常用操作命令
实验目的:
1、 掌握文件和命令查找,包括命令grep、find、locate、whereis、file等。
2、 掌握系统信息显示命令,包括uname、hostname、cal、date等。
3、 掌握信息交流命令,包括echo、mesg、write等。
实验内容:
1、使用命令查找/etc目录下的文件named.conf。
2、使用命令将当前计算机的主机名修改为IT。
3、使用命令显示公元20##年8月的月历。
4、使用命令将当前计算机时间设置为20##年8月6日,并显示当前时间。
5、使用命令显示/etc/named.conf文件的文件类型。
实验步骤及结果:
实验五 Shell程序的创建及变量
实验目的:
1、 掌握Shell程序的创建过程及Shell程序的执行方法。
2、 掌握Shell变量的定义方法,及用户定义变量、参数位置等。
3、 掌握变量表达式,包括字符串比较、数字比较、逻辑测试、文件测试。
实验内容:
1、查看当前系统下用户Shell定义的环境变量的值。
2、定义变量AK的值为200,并将其显示在屏幕上。
3、定义变量AM的值为100,并使用test命令比较其值是否大于150。
4、创建一个简单的Shell程序,其功能为显示计算机主机名以及显示系统日期和时间,并执行该程序。
实验步骤及结果:
实验六 Shell流程控制语句
实验目的:
1、 掌握条件判断语句,如if语句、case语句。
2、 掌握循环控制语句,如for语句、while语句、until语句。
实验内容:
1、使用for语句创建一个Shell程序,其功能为1+2+3+4+5+…+n。
2、使用until语句创建一个Shell程序,其功能为计算1-10的平方。
实验步骤及结果:
实验七 用户和组群账户管理
实验目的:
1、 掌握字符界面下用户账户的设置,包括命令useradd、usermod、userdel。
2、 掌握字符界面下组群账户的设置,包括命令groupadd、groupmod、groupdel。
3、 掌握用户和组群维护命令,包括passwd、chfn、chsh、su、w、who等。
实验内容:
1、使用命令创建用户账户zhangsan,并设置口令为123456,设置用户名全称为张三,办公室电话为57111111。
2、使用命令修改用户账户zhangsan的UID为700,其Shell类型为/bin/ksh。
3、使用命令设置用户账户zhangsan两次改变密码之间相距的最小天数为5天,两次改变密码之间的最大天数为20天。
4、使用命令删除用户账户zhangsan,并且在删除该用户的同时一起删除其主目录。
5、使用命令创建组群group1,并在创建时设置其GID为800。
6、使用命令修改组群group1的新组群名称为shanghai,设置组群group1的口令为123456。
实验步骤及结果:
实验八 磁盘和文件系统管理
实验目的:
1、 掌握挂载和卸载文件系统的方法。
2、 掌握文件权限设置的方法,以及如何修改文件所有者及用户。
实验内容:
1、使用命令挂载U盘,并能正确显示U盘中的中文信息。
2、分别用文字设定法和数字设定法,对/root/ab文件设置权限,所有者为读取、写入和执行权限,同组用户为读取和写入权限,其他用户没有任何权限。
3、将文件/root/ab所有者更改为用户zhangsan。
4、将目录/root/b连同它的下级文件/root/b/cc的所有者和用户组一起更改为newuser。
实验步骤及结果:
一、设计题目
进程管理及理解和增加Linux系统调用
二、设计时间和地点
设计时间:20##年12月26日——20##年12月29日
设计地点:装备制造学院B座502机房
三、设计目的和要求
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程争用资源的现象,学习解决互斥的方法。
(4)了解Linux系统中进程通信的基本原理。
(5)弄清进程管理在操作系统中的地位和作用。
(6) 初步揭开Linux内核的神秘“面纱”,为今后深入学习内核原理打下基础。
(7)弄清系统调用原理,以及操作系统在处理每个系统调用的时候,用户态怎样切入核心态?又怎样从核心态返回到用户态的?
四、设计内容
(1)实验准备
a. 基本头文件
<sys/types.h>:类型头文件,定义了基本的系统数据类型。
<unistd.h>:定义了各种符号常数和类型,并声明了各种函数。
<stdio .h>带缓冲的标准输入输出!
<stdlib.h>头文件即standard library标准库头文件
b.vi编辑器的基本使用
[root@localhost ~]# vi filename
Command 模式是vi默认模式,如果我们处于其它命令模式时,当我们按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令;
:w 保存;
:w filename 另存为filename;
:wq! 保存退出;
:wq! filename 注:以filename为文件名保存后退出;
:q! 不保存退出;
c.gcc的基本使用
1、直接编译
gcc filename.c -o filename
2、分步编译
进行预编译
# gcc -E hello.c -o hello.i
生成目标代码
# gcc -c hello.i -o hello.o
链接成可执行文件
# gcc hello.o -o hello
d.U盘的挂载与卸载
先要为外挂点新建一个子目录,一般外挂点的子目录都是建立在/mnt里面的,也建在那里,当然也可以建在/目录下,名字可以自己定,就取名为usb,终端下的命令如下:mkdir /mnt/usb
然后接上U盘了,在终端下输入mount /dev/sdb1 /mnt/usb命令并击Enter
删除挂起点,方法是:umount /dev/sdb1 /mnt/usb 或 umount /dev/sdb1
(2)设计内容
1、进程的创建
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“A”;子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。
a、程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
main()
{
if(fork()==0)
{
printf("进程b 该进程的ID号为:%d\n",getpid());
exit(0);
}
else
{
if(fork()==0)
{
printf("进程c 该进程的ID号为:%d\n",getpid());
exit(0);
}
printf("进程a 该进程的ID号为:%d\n",getpid());
exit(0);
}
}
b、程序解释
fork()函数:
功能:创建一个新进程。
格式:int fork()
返回值:
·0:创建子进程,从子进程返回的id值
·大于0:从父进程返回的了进程id值
·-1:创建失败
getpid()函数:getpid函数用来取得目前进程的进程识别码,许多程序利用取到 的此值来建立临时文件
c、结果截图
c、结果分析
多次运行程序,显示结果不一定唯一。具体显示顺序由调度机制决定。
2、进程的控制
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察 程序执行时屏幕上出现的现象,并分析原因。
如果在程序中使用系统调用lockf(),来给每一个进程加锁,可以实现进程之间 的互斥,观察并分析出现的现象。
a、 程序代码
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
main()
{
int p1,p2,i;
if(p1=fork()){
lockf(1,1,0);
printf("子进程2已创建!!\n");
exit(0);
}
else{
if(p2=fork())
printf("子进程1已创建!!\n");
exit(0);
else
printf("父进程已经创建!!\n");
exit(0);
}
}
b、结果截图
c、 结果分析
成功显示一段话,其中循序与进程的调度机制有关
加入lockf()函数后
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
main()
{
int p1,p2,i;
if(p1=fork()){
lockf(1,1,0);
printf("子进程2已创建!!\n");
exit(0);
lockf(1,0,0);
}
else{
if(p2=fork())
lockf(1,1,0);
printf("子进程1已创建!!\n");
exit(0);
lockf(1,0,0);
else
lockf(1,1,0);
printf("父进程已经创建!!\n");
exit(0);
lockf(1,0,0);
}
}
b、程序解释
lockf()函数:允许将文件区域用作信号量,或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。当进程终止时,将释放进程保留的所有锁定。
c、结果分析
显示结果与未加lockf()并无太大区别,只是显示固定
3、①编制一段程序,使其实现进程的软中断通信。
要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号;当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child Process11 is Killed by Parent!
Child Process12 is Killed by Parent!
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent Process is Killed!
a、 程序框图
b、程序代码:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
void waiting(),stop();
int wait_mark;
main()
{
int p1,p2;
if(p1=fork()){
if(p2=fork()) {
wait_mark=1;
signal(SIGINT,stop);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("parent process is killed!\n");
exit(0);
}
else{
wait_mark=1;
signal(SIGINT,stop);
waiting();
lockf(1,0,0);
printf("child process2 is killed by parent!\n");
lockf(1,0,0);
exit(0);
}
}
else{
wait_mark=1;
signal(SIGINT,stop);
waiting();
lockf(1,0,0);
printf("child process1 is killed by parent!\n");
lockf(1,0,0);
exit(0);
}
}
void waiting()
{
while (wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
c、 程序解释:
kill(p1,16):用来送参数16(代表用户自定义信号一)指定的信号给参数p1指定的进程
kill(p2,17):用来送参数17(代表用户自定义信号二)指定的信号给参数p2指定的进程
signal(SIGINT,stop):捕捉SIGINT信号(ctrl+c会产生该信号),转而执行stop函数
d、 结果截图
e、 结果分析:
由于stop函数与waiting函数共同作用。保证了Parent Process is Killed!一定在Child Process11 is Killed by Parent!Child Process12 is Killed by Parent!之后输出。
f、 调试问题:
由于网上原版的程序代码没有<stdlib.h>头文件。而exit(0);是包含在该头文件中,所以会出现“隐式声明与内建函数 ‘exit’ 不兼容”错误。
②在上面的程序中增加系统调用signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。
a、程序代码:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
int pid1,pid2;
int EndFlag=0;
int pf1=0;
int pf2=0;
void IntDelete()
{
kill(pid1,16);
kill(pid2,17);
EndFlag=1;
}
void Int1()
{
printf("child process 1 is killed !by parent\n");
exit(0);
}
void Int2()
{
printf("child process 2 is killed !by parent\n");
exit(0);
}
main()
{
int exitpid;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
if(pid1=fork())
{
signal(SIGUSR1,Int1);
signal(SIGINT,SIG_IGN);
pause();
exit(0);
}
else
{
if(pid2=fork())
{
signal(SIGUSR1,Int1);
signal(SIGINT,SIG_IGN);
pause();
exit(0);
}
else{
signal(SIGINT,IntDelete);
waitpid(-1,&exitpid,0);
printf("parent process is killed\n");
exit(0);
}
}
}
b、程序解释:
signal(SIGINT,SIG_IGN):捕捉中断信号,用SIG_IGN忽略
pause():暂停程序,知道signal发出信号
c、结果分析:
由于忽略了中断与退出信号,程序会一直保持阻塞状态而无法退出
4、进程的管道通信
编制一段程序,实现进程的管道通信,
使用系统调用pipe()建立一个管道文件;两个子进程P1和P2分别向管道各写一句话:
Child1 is sending a message!
Child2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
a、 程序框图
b、 程序代码:
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
#include<stdio.h>
int pid1,pid2;
main()
{
int fd[2];
char OutPipe[100],InPipe[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0)
{
lockf(fd[1],1,0);
sprintf(OutPipe,"child 1 process is sending message!"); write(fd[1],OutPipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
lockf(fd[1],1,0);
sprintf(OutPipe,"child 2 proeess is sending message!");
write(fd[1],OutPipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0);
read(fd[0],InPipe,50);
printf("%s\n",InPipe);
wait(0);
read(fd[0],InPipe,50);
printf("%s\n",InPipe);
exit(0);
}
}
}
c、程序解释:
read(fd[0],InPipe,50); 参数handle所指的文件传送nbyte个字节到buf指针所指的内存中。
write(fd[1],OutPipe,50);//fd[1]文件描述符(写),buffer,50个字节
sprintf(OutPipe,"child 1 process is sending message!");//将引号内容输入到OutPipe数组中
sleep(5):让程序睡眠5秒
pipe(fd):通道函数,参数确定读写操作
d、结果截图:
e、结果分析
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。
(三)、自学笔记:
程序段中每个进程退出时都用了语句exit(0),为什么?请读者思考。
这是进城的正常终止。在正常终止时exit()函数会返回进程结束状态。异常终止时,则由系统内核产生一个代表异常终止原因的终止状态。该进程的父进程都能用wait()得到其终止状态。在子进程调用exit()后,子进程的结束状态会返回给系统内核,由内核根据状态字生成的终止状态。供父进程在wait()中读取数据,若子进程结束后,父进程还没有读取子进程的终止状态,则系统就子进程的终止状态设置为“ZOMBIE”并保留子进程的控制块信息。父进程读取信息后,系统才彻底释放子进程的控制块。若父进程在子进程结束之前结束的话,则子进程就编程了“孤儿进程”,系统进程init会自动“收养”该子进程,成为该子进程的父进程即父进程标识号变为1,当子进程结束时,init会自动调用wait()读取子进程的遗留数据,从而避免在系统中留下的大量垃圾。
信号标识表
参考书目
《Linux的内核与编程》 机械工业出版社 雷澎等
《Linux的安装与使用》 机械工业出版社 雷澎等
《操作系统课程设计》 机械工业出版社 罗宇等
有关Linux的相关书籍
(四)、设计体会:
linux系统不同于windows系统,图形界面功能不是很强大,但是它的运行速度及响应时间快于windows,而且性能稳定。本次试验,初步接触了linux系统。对其命令行的操作方式初步了解。深刻感触到我现在对鼠标的依赖。比如U盘的加载与卸载,以前windows系统下只是点一点鼠标就能解决。可是linux系统下需要自己敲命令代码,否则寸步难行。对于命令行方式的了解相信会给我将来学习铺好路,因为以后接触的东西一定会那些没有现成结果的,需要自己动手创建的。关于程序方面,虽然多数是从网上拷贝的,因为对于linux的系统调用我并不熟悉,比如fork()函数我就从来没有见过。还有linux下c语言的头文件都不是很清楚。但是这次的实验并没有仅仅的拷贝粘贴。我细心的分析了网上的程序,每个不懂得函数都仔细的查询了其功能及参数。让我对linux的系统调用有了初步认识。也初步接触了linux系统下编程过程。此外,我还附加的了解了vi编辑器的基本使用。现已经成使用vi编辑器编辑c语言函数。也今本掌握了gcc编译器的编译过程。不过同时也存在一些问题。比如,我还是不能熟练的应用linux系统调用,还不能靠自己的能力写出实验内容程序。总之,本次试验我受益匪浅,拓展了不同的操作系统方面的知识。相信这只是起步,将来我会在这个基础上进一步发展。
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月…
目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验…
操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
20xx春季学期高中英语教学工作总结本学期,我担任高三(18)(19)的英语教学工作.作为从事中学英语教学的我,虽了解到了一些教学…
见习总结尊敬的领导,你们好!时间过的真快。从进厂至今,一转眼我已来新港船厂一年了,在新港船厂实习近一年。在这一年里里有苦有甜,有不…
个人工作总结尊敬的领导:我叫柳长富,在武绍高速公路项目部工作。从08到项目工作至今已有一年多,在这一年多的时间内我带领新来的技术人…
20xx—20xx年羽毛球兴趣小组训练工作总结田自伟在过去的一年里,我学到了不少新知识,也成长了不少。现就羽毛球训练工作总结如下:…
一)运用公式法:我们知道整式乘法与因式分解互为逆变形。如果把乘法公式反过来就是把多项式分解因式。于是有:a2-b2=(a+b)(a…