Linux基础操作实验报告

时间:2024.4.20

一、目的(本次实验所涉及并要求掌握的知识点)

1、熟悉启动Linux虚拟机与同时使用多个控制台登录Linux的基本操作;

2、熟练使用date、shutdown、exit、halt、reboot等命令;

3、掌握shell中的特殊按键、Linux中的基本命令;

4、掌握对文件的备份和恢复。

二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)

1、实验内容

1)练习使用启动Linux虚拟机

2)练习同时使用多个控制台登录Linux

3)练习使用date、shutdown、exit、halt、reboot等命令

a.使用date命令修正系统时间,改为当前日期时间

b.使用shutdown命令发出警告信息,查看其他控制台上的用户是否收到信息。

c.通过Internet查找,是否还有其他的关机命令

4)练习操作shell中的特殊按键

在做以下实验之前,用root登录到虚拟控制台1(下面简称vc1),运行如下命令:

useradd mike

passwd mike

添加mike用户

然后用新增加的mike用户分别登录虚拟控制台2和3

在虚拟控制台3下用mike用户登录成功后,运行如下命令:

su (变换身份到超级用户,需要输入root的密码)

5)练习所学习的基础命令,完成以下问题:

a.logname和whoami的区别,举例说明

b.从vc1向vc3用write命令发信息,写出这条完整的命令

c.假设当前路径为:/home/mike,需要变换到绝对路径为/etc/default目录下,则该命令用相对路径怎么写?

6)用tar命令实现如下备份和恢复:(备份文件均放在/root目录下)

a.对/home目录进行压缩备份(采用gzip压缩),备份文件名为home.tar.gz

b.对/home目录进行压缩备份(采用bzip2压缩),备份文件名为home.tar.bz2,比较二种工具的压缩能力

c.在/home目录下建立文件a,在/home目录下建立目录test,在/home/test目录下建立文件b(用vi编辑任意内容)

d.对/home目录进行增量备份,备份20##年9月19日以来变化的文件,备份文件名为home.20110919.tar

e.删除目录/home,会出现什么情况?然后利用上述备份恢复所有文件。

7)填写实验报告单,下周实验课前将电子文档传到服务器上,实验报告单的文件名格式为“9.19-xxx实验报告”,xxx为自己的名字

三、实验使用环境(本次实验所使用的平台和相关软件)

VMware、Red Hat Enterprise Linux 5

   

四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)

1)启动Linux虚拟机和同时多个控制台登录Linux

从VMware中启动Red Hat Enterprise Linux 5,当要同时多个控制台登录Linux时按Ctrl+F1(或F2~F9中任选其一)切换到不同的虚拟机登录同一用户或不同用户。通过命令who或w可以查看显示当前在线的全部用户。

2) 练习使用date、shutdown、exit、halt、reboot等命令

date  时间格式为:MMDDhhmm[[CC]YY][.ss]

MM代表月(注意是2位,即2月应写02,以下类似)、DD代表日hh代表时、mm代表分、CC代表年份前2位、YY代表年份后2位、ss代表秒

shutdown命令 格式:shutdown  [选项]  [时间]  [警告信息]

一个控制台的用户启动shutdown命令后,系统会向所有控制台的用户广播。

发出shutdown命令的控制台

接收到广播信息的其他控制台

    

其他退出命令:

exit或logout:用户注销只是切断了当前用户的前台工作,Linux后台还是在忙碌着,提供正常的服务;

halt命令:无需等待立即关闭系统,相当于shutdown –h now;

reboot命令:无需等待立即重启系统,相当于shutdown –r now;

3) 操作shell中的特殊按键

添加mike用户,新增加的mike用户分别登录虚拟控制台2和3,在虚拟控制台3下用mike用户登录成功后,运行命令su (变换身份到超级用户,需要输入root的密码)

4) 练习所学习的基础命令

logname和whoami的区别

logname显示登录系统的用户名字;whoami显示用户当前的身份.

从vc1向vc3用write命令发信息

write命令格式:write   用户账号   [终端号] (写完内容后以ctrl+d作为结束)

Mike用户接收的信息

当前路径为:/home/mike,需要变换到绝对路径为/etc/default目录下,用命令用相对路径写

对/home目录进行压缩备份(采用gzip压缩),备份文件名为home.tar.gz

对/home目录进行压缩备份(采用bzip2压缩),备份文件名为home.tar.bz2。bziip2不具有将多个文件或目录进行打包的功能,只能单纯的对文件进行压缩。

在/home目录下建立文件a,写入内容后显示文件a的内容

在/home目录下建立目录test,在/home/test目录下建立文件b

显示文件b的内容

删除目录/home

删除/home目录后不能添加新用户

删除/home目录后除超级用户root外的其他原有用户都不能使用

对备份文件进行解压,解压文件在/root目录下

将文件移动根目录下就恢复了

五、实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)

1、遇到的问题及解决过程

删除/home目录后对压缩文件解压,还是不能添加用户或登录原来添加的用户?后来想到/root和/home是同一级的目录文件,而解压后的/home目录在/root目录下,于是将/root目录下的/home目录移到根目录下,问题就解决了。

2、实验体会和收获

第一次用Linux,对Linux里的命令、一些查看文件信息等基本操作都不熟悉,敲写命令是要一直查看课件或书本,通过本次实验后有了基本的认识和掌握一些常用的命令。

要多上机练习,才能更快的掌握。

最后备份和恢复的不太正确

六、附录(参考文献和相关资料)

    《Linux系统与网络服务管理技术大全(第二版)》


第二篇:linux操作系统实验报告


一、设计题目
进程管理及理解和增加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系统调用,还不能靠自己的能力写出实验内容程序。总之,本次试验我受益匪浅,拓展了不同的操作系统方面的知识。相信这只是起步,将来我会在这个基础上进一步发展。

更多相关推荐:
操作系统实验报告-Linux操作、使用、编程)

实验报告20xx20xx学年第二学期课程名称实验名称实验时间指导单位操作系统ALinux操作使用编程20xx年5月6日计算机学院计算机科学与技术系指导教师徐小龙学生姓名学院系陈坤通达学院班级学号专业100029...

操作系统课程设计实验报告(以Linux为例)

操作系统课程设计实验报告学号姓名苏州大学计算机科学与技术学院20xx年9月操作系统课程设计实验报告目录目录1一实验环境2二实验报告总体要求2实验一编译LINUX内核3实验二观察LINUX行为7实验三进程间通信1...

linux操作系统实验报告书

linux操作系统实验报告书1一实验名称Linux基本命令的使用二实验目的1进一步练习Linux登录和退出的方法2练习与目录和文件操作相关的Linux命令cd切换目录mkdir建立一个新目录cp文件拷贝ls显示...

linux操作系统指令实验报告

实验一Linux的基本操作和常用命令的使用一实验目的1学会安装Linux操作系统2掌握Linux系统的一些基本操作3掌握常用Linux命令的使用方法4了解Linux命令中参数选项的用法和作用二实验环境1Linu...

Linux操作系统实习报告

沈阳航空航天大学Linux系统操作实习报告院系计算机学院专业计算机科学与技术班级84010103学号20xx040101061姓名李雪城指导教师王越完成日期20xx年7月22日7月18日实习内容今天是Linux...

Linux操作系统的安装及使用实验报告

实验报告课程名称计算机网络原理与技术实验项目Linux操作系统的安装及使用专业班级姓名学号指导教师成绩日期一实验目的1掌握虚拟机VMware软件的安装和使用2掌握Linux系统软件的安装和使用4掌握Linux命...

操作系统实验报告-Linux基本操作命令

实验名称Linux基本操作命令组别合作者日期

Linux操作系统实验报告 存储管理试验

Linux操作系统实验报告 存储管理试验,内容附图。

Linux操作系统实习报告

Linux系统操作实习报告院系班级学号姓名实习内容Linux的系统操作实习的第一天尚观科技长期开发高端UNIXLinux嵌入式开发Linux集群Linux内核POSIX开发Oracle集群等课程及相关企业解决方...

操作系统linux安装实验报告

操作系统原理课程设计报告实验二题目Linux的安装班级0710063学号姓名专业计算机科学与技术指导教师Linux的安装1实训目的了解Linux的发行版本以及Linux系统对硬件资源的要求掌握Linux系统的安...

操作系统实验报告 windows部分(原创)

操作系统实验报告windows部分班级姓名学号31Windows任务管理器的进程管理实验估计时间60分钟实验目的工具准备工作背景知识Windows20xx的任务管理器提供了用户计算机上正在运行的程序和进程的相关...

实验报告 安装windows操作系统

电脑选购与维护实验报告31234

linux操作系统实验报告(21篇)