Linux实验指导书.docx
《Linux实验指导书.docx》由会员分享,可在线阅读,更多相关《Linux实验指导书.docx(34页珍藏版)》请在冰点文库上搜索。
![Linux实验指导书.docx](https://file1.bingdoc.com/fileroot1/2023-8/20/137dbfad-8367-407e-bef2-877439a9e082/137dbfad-8367-407e-bef2-877439a9e0821.gif)
Linux实验指导书
《Linux操作系统》
实验指导书
适用专业:
计算机科学与技术
江苏科技大学计算机科学与工程学院
2008年12月
前言
本课程是计算机科学与技术专业的一门专业基础课。
通过学习主要使学生掌握操作系统的基本原理,课程以Linux操作系统为例进行讲解,实验也是在Linux操作系统下进行的。
为了加深和巩固学生对操作系统实现原理的理解,培养学生熟练运用操作系统进行应用程序设计,本课程设置了7个实验,对操作系统基本操作、程序设计基础、进程管理、存储管理、文件管理、设备管理、网络管理等方面设置了实验。
具体实验项目为:
(1)实验一熟悉Linux常用命令;
(2)实验二Linux下程序设计基础;
(3)实验三Linux下进程间管道通信;
(4)实验四IPC进程间共享内存通信;
(5)实验五IPC信号量使用
(6)实验六Linux内存基本原理
(7)实验七Linux文件管理实验
(8)实验八设备驱动程序
(9)实验九Linux下socket网络通信。
实验一要求熟练Linux下的常用命令,熟练地操作linux。
实验二要求掌握vim编辑器,gcc编译器和gdb调试器的使用。
实验三要求掌握有名管道和无名管道的使用。
实验四要求熟悉共享内存的实现原理,并掌握其使用方法。
实验五要求掌握信号量的使用方法。
实验六要求掌握内存的操作及内存分配和回收等函数的使用。
实验七要求掌握文件操作函数的使用。
实验八要求理解驱动程序的结构,自己编写简单的模块程序。
实验九要求理解网络间进程间通信的基本理论,了解客户/服务器模式;掌握socket的结构以及通信的实现方法。
实验一熟悉Linux常用命令
实验学时:
3学时
实验类型:
演示
实验要求:
必修
一. 实验目的:
1. 掌握Linux下各类命令的使用方法;
2. 熟悉Linux操作环境。
二. 实验内容:
练习使用Linux常用命令。
三. 实验环境:
一台已经安装好Linux操作系统的主机/或安装过vmware的windows系统。
四、 实验操作:
虚拟机的安装见附件1
Linux下常用命令见附件2
1) 获得命令帮助
分别演示一下help--helpmaninfo命令的用法;
2) 目录操作命令
(1)启动计算机,利用root用户登录到系统,查看提示符,区别#和$提示符。
(2)用pwd命令查看当前所在的目录。
(3)用ls命令列出此目录下的文件和目录,包括ls-a;ls-l;ls-R等选项的使用。
(4)使用cd装换目录命令,练习绝对路径和相对路径的使用.\
(5) 进入/home目录下,创建目录test,进入test目录,在该目录下创建一个文件hello.C,创建一个目录toto,进入toto目录,创建子目录tata,创建文件test.c.
(6)删除创建的hello.c,删除目录toto.
(7)在/root下创建文件hello.c,拷贝该文件到/home/test下(如果test目录不存在自己创建),并命名文件为tt.c。
(8) 使用catmorelesstailhead显示文件的内容。
只看/etc/passwd的前5行内容。
只看/etc/passwd的后5行内容。
(9)管道的使用,cathello.c|grep"hello",在hello.C文件中查找具有字符串"hello"的行.
(10)重定向的使用。
符号>>>发现其不同的用法。
(11)压缩命令的使用。
创建三个文件1.Jpg2.Jpg3.Jpg,
把三个文件打包tarcvfhello.tar1.Jpg2.Jpg3.jpg
压缩gziphello.tar
将hello.tar拷贝到其他目录下解压缩:
gzip-dhello.tar.gz
解包hello.tar
tar-xvfhello.tar
(12)练习拷贝命令,重命名命令,查找命令的使用
(13)熟悉根文件系统下的目录
1)文件操作命令
(1)查找/etc下的passwd这个文件。
(2) 查找/home目录下的所有文件名中有profile的文件,其命令为。
(3)在/home下面创建test目录,在test目录下创建目录a,在a目录下创建目录b,在b目录中创建目录c.在目录c中创建d,用一个命令完成。
(4)创建一个软连接指向/usr/src的源代码,修改源文件,查看连接文件是否改变
2)用户管理与组管理
(1)建立帐号user01,查看/etc/passwd文件有没变化,并设置user01的密码为123456。
在查看/etc/shadow文件有无变化。
● 查看/etc/group文件。
● 新建一个组,组名为group01,在新建一个用户user02,并指定它的组为group01
● 把user02的组更改为user01,
● 删除user01这个用户
● 删除group01这个组
5) 文件的权限属性
● 查看/etc/passwd的权限,在查看/etc/shadow的权限。
● 在/home下面新建afile文件,查看它的权限
● 新建user02这个帐户,
● 新建group02这个组,
● 把afile的权限设置为对用户来说可读可写,对组来说可读,对其他用户来说没有任何权限
● 把afile文件的所有者更该为user02,所属组更改为group02,
五、 思考题:
1、 如何查看隐含文件列表?
2、如何将一个目录中的所有文件拷贝到另一个目录中,包括这个目录中的隐含文件。
3、 如何删除一个目录包括其中的所有文件,并且不显示任何提示信息?
4、 什么是绝对路径?
什么是相对路径?
如何表示?
实验二Linux下程序设计基础
实验学时:
3学时
实验类型:
验证
实验要求:
必修
一. 实验目的:
1. 掌握Linux下常用编辑器的使用;
2. 掌握linux下程序的编译/调试方法。
二. 实验内容:
练习linux下的c语言程序设计,熟练使用vim编辑器编辑文件。
学会gcc编译器的使用及常用的编译选项。
能够使用gdb调试器进行调试程序。
三. 实验环境:
一台已经安装好Linux操作系统的主机/或安装过vmware的windows系统。
四、实验操作:
1.Vi编辑器的使用
1)vi编辑器的启动
在控制台下输入
$vi
或
$vi文件名
即可启动vi编辑器。
如果文件是一个新文件,就会在屏幕底部现实一个信息,说明用户正
在创建新文件。
2)Vi编辑进入插入模式
3)Vi的保存与退出(末行模式下常用命令)
4)命令模式下常用的命令
命令
含义
x
删除光标所指向的当前字符
nx
删除光标所指向的前n个字符
dd
删除光标所在行,并去除空隙
ndd
删除n行内容,并去除空隙
小写字母p
将缓冲区的内容粘贴到光标的后面
大写字母P
将缓冲区的内容粘贴到光标的前面
yy
复制当前行到内存缓冲区
nyy
复制n行内容到内存缓冲区
u
撤消前一条命令的结果
练习要求:
用vi编辑器编写一段文字,然后用上述命令进行操作,最后保存退出。
2.Gcc编译器的使用
1)用vi编辑器编写一个简单helloworld程序,命名为hello.c,保存退出。
2)Gcc编译该hello.c文件,要求生成hello可执行文件,并加入调试信息。
3)运行hello文件,查看实验结果。
Gcc下常用的命令选项:
-c选项:
告诉gcc仅把源程序编译为目标代码而并不做链接工作生成.o文件
-o选项:
默认情况下,在gcc没有指定编译选项的情况下会在当前目录生成一个名为a.out的可执行程序。
-g选项:
在可执行文件中输出调试信息,通常是为调试器gdb所用
-Idir选项:
指定库以及头文件搜索路径
-Ldir选项:
指定在目录中需要搜索的库(动态库.so和静态库.a)
3.Gdb调试器的使用
进入gdb调试环境
Gdbhello
然后用如下命令进行操作:
调试基本步骤:
✧Gdb<可执行文件名>进入程序调试环境
✧Break设置断点
✧Run运行程序
✧Next单步运行
五、思考题:
1.断点是否可以设置多个,自己试试看。
如何清除所设的断点?
2.如果要调试程序,编译时有何要求?
自己写一个完整的程序,该程序主要完成数组排序,按照由小到大顺序排列给定数组的数据。
并进行编译、调试,查看运行结果,写出整个步骤。
实验三Linux下进程间管道通信
实验学时:
4学时
实验类型:
综合
实验要求:
必修
一. 实验目的:
1. 掌握Linux下有名管道和无名管道通信的原理;
2. 掌握Linux下进程创建、撤销的方法。
二. 实验内容:
(1)编写程序,创建一个进程,通过无名管道实现父子进程之间的通信。
(2)创建一个有名管道,实现任意两个进程之间的通信。
三. 实验环境:
一台已经安装好Linux操作系统的主机/或安装过vmware的windows系统。
四、实验原理
1.无名管道
无名管道只能实现父子进程或具有亲缘关系的进程间的通信,系统调用为:
intpipe(intpipe[2]),参数是2个元素的int型数组,pipe[0]是读取管道的文件标识符,pipe[1]是写入管道的文件标识符。
所使用的头文件#include。
Ø使用时先建立管道再建立子进程的顺序不能变。
若不然,先建立子进程,再建立管道,管道只对建立它的进程可见,对另一个进程是看不见的,因此无法实现父子间的通信。
2.有名管道
有名管道可以实现任意两个进程间的通信,不局限于具有亲缘关系的进程。
系统调用为:
intmkfifo(constchar*path,mode_tmode),
path:
要使用的命名管道的路径和名字
mode指明管道的访问权限(O_RDONLY,O_WRONLY,O_RDWR)
所使用的头文件:
#include#include
五、实验参考代码
1.无名管道通信
pipe(pipe_fd)
if((pid=fork())==0)
{
close(pipe_fd[1]);
sleep
(2);
if((r_num=read(pipe_fd[0],buf_r,100))>0){
printf("%dnumbersreadfromthepipeis%s\n",r_num,buf_r);
}
close(pipe_fd[0]);
exit(0);
}
elseif(pid>0)
{
close(pipe_fd[0]);
if(write(pipe_fd[1],"Hello",5)!
=-1)
printf("parentwrite1success!
\n");
if(write(pipe_fd[1],"Pipe",5)!
=-1)
printf("parentwrite2success!
\n");
close(pipe_fd[1]);
sleep(3);
waitpid(pid,NULL,0);
exit(0);
}
六、有名管道的创建
#defineFIFO"/tmp/myfifo"
mkfifo(FIFO,O_CREAT|O_EXCL)
七、实验要求
(1)用无名管道实现父进程和子进程之间的信息传送,父进程发送一段信息,子进程从管道中读出信息并打印。
(2)有名管道实现同样的内容,一个进程发送信息,另外一个进程把信息读出并打印显示。
实验要求写好预习报告。
实验结束时,要写好实验报告,包括实验的源代码以及实验结果图。
八、思考题
1.为什么无名管道只能在具有亲缘关系的进程间通信。
2.管道与文件有什么样的区别。
实验四IPC进程间共享内存通信
实验学时:
4学时
实验类型:
综合
实验要求:
必修
一. 实验目的:
1. 掌握Linux下进程间使用共享内存进行通信的基本原理;
2. 掌握共享内存的使用方法。
二. 实验内容:
1.创建一块共享内存,然后使用该共享内存实现两个进程之间的通信。
三. 实验环境:
一台已经安装好Linux操作系统的主机/或安装过vmware的windows系统。
四.实验原理
1.Linux采用内存映射技术把共享内存区域映射到有关进程的虚拟内存空间,使他成为进程虚拟内存的一部分,从而进程可以对这部分虚拟内存区域进行读写。
错误!
未找到引用源。
对共享内存的基本操作包括:
Ø进程与共享内存的结合;共享内存映射到进程虚拟区域的过程
Ø进程与虚拟内存的分离;当使用共享内存完成数据交换后需要释放相关的虚拟内存区域,即脱离与共享内存的的联系。
Ø主要系统调用
(1)intshmget(key_tkey,intsize,intshmflg)//创建共享内存
(2)shmctl(intshmid,intcmd,structshmid_ds*buf)//共享内存的控制
(3)intshmat(intshmid,char*shmaddr,intshmflg)//共享内存映射到进程虚拟区域
(4)intshmdt(char*shmaddr)//进程与虚拟内存的分离
Ø参考程序段:
shmid=shmget(KEY,SIZE,IPC_CREAT|0600);/*建立共享内存*/
if(shmid==-1){
printf("createsharememoryfailed:
%s",strerror(errno));
return0;
}
if(fork()==0){/*子进程*/
/*系统自动选择一个地址连接*/
shmaddr=(char*)shmat(shmid,NULL,0);
if(shmaddr==(void*)-1){
printf("connecttothesharememoryfailed:
%s",strerror(errno));
return0;
}
strcpy(shmaddr,"hello,thisischildprocess!
\n");
shmdt(shmaddr);/*detach共享内存*/
return0;
}else{/*父进程*/
sleep(3);/*等待子进程执行完毕*/
shmctl(shmid,IPC_STAT,&buf);/*取得共享内存的相关信息*/
printf("sizeofthesharememory:
");
printf("shm_segsz=%dbytes\n",buf.shm_segsz);
printf("processidofthecreator:
");
printf("shm_cpid=%d\n",buf.shm_cpid);
printf("processidofthelastoperator:
");
printf("shm_lpid=%d\n",buf.shm_lpid);
/*系统自动选择一个地址连接*/
shmaddr=(char*)shmat(shmid,NULL,0);
if(shmaddr==(void*)-1){
printf("connectthesharememoryfailed:
%s",strerror(errno));
return0;
}
printf("printthecontentofthesharememory:
");
printf("%s\n",shmaddr);
shmdt(shmaddr);/*detach共享内存*/
五、实验要求
(1)用共享内存实现2个进程之间的通信,一个进程向共享内存发送一段信息,另外一个进程读共享内存并把信息打印显示。
(2)要求写好预习报告。
实验结束时,要写好实验报告,包括实验的源代码以及实验结果图。
六.思考题
1.共享内存通信相比其它通信方式有没有优势?
实验五IPC信号量使用
实验学时:
4学时
实验类型:
综合
实验要求:
必修
一、实验目的:
1.学习在LINUX下信号量的使用方法。
2.学习使用信号量实现进程间互斥操作的原理。
二. 实验内容:
在PC机上编写程序,实现2个进程间的互斥操作。
三. 实验环境:
一台已经安装好Linux操作系统的主机/或安装过vmware的windows系统。
四、实验原理
信号量机制用于进程同步与互斥。
某种资源的信号量代表该资源的数量,可以限制一种资源同时被多少个地方访问。
一个进程如果申请信号量失败,说明那个资源在其他地方被使用,需要等待,于是这个进程会被挂起,等资源释放了再继续。
(1)在Linux下使用信号量的步骤:
1)创建信号量集合
2)初始化信号量的个数,即设置每种信号量有多少个。
3)申请获得某个信号量
4)释放以获得的某个信号量
(2)系统调用
1)创建信号量集合:
intsemget(key_tkey,intnsems,intflag)
a)key是用来生成信号量标识的整数,使用IPC_PRIVATE可以由系统自动选择。
b)nsems是信号量集合中有多少种信号量。
创建两种信号量并不需要调用这个函数两次,只要设置nsems就可以一次创建多种信号量。
c)flag是信号量访问权限,用S_IRWXU设为可读写
2)初始化信号量个数:
intsemctl(intsemid,intsemnum,intcmd,unionsemunarg)
a)semid是信号量集合标识,由semget()产生
b)semnum用来指定要访问信号量集合中的哪个信号量,第一个信号量编号为0,其余递增。
c)cmd是执行的操作,有很多种,这里用SETVAL,设置信号量个数。
d)arg是输入信息,新的信号量个数写在里面。
arg是一个需要自己定义的联合体,结构如下:
unionsemun
{
intval;//要把信号量设置为多少
structsemid_ds*buf;//一个系统定义的结构体,本例中不用理会
ushort*array;//用于一次设置多个信号量,本例不用理会
}
3)申请获得某个信号量:
intsemop(intsemid,structsembufsemoparray[],size_tnops)
a)semid是信号量集合标识,由semget()产生
b)semoparray[]是一个结构体数组,由这个数组指定要操作那个信号量,是申请还是释放,申请多少或释放多少,如果申请不到的话是略过还是等待。
sembuf结构体定义如下:
structsembuf{
ushortsem_num;//选择要操作集合中的哪个信号量,编号从0开始
shortsem_op;//+n表示归还n个信号量,-n表示申请n个信号量
shortsem_flg;//失败处理,IPC_NOWAIT表示略过,SEM_UNDO表示等待
}
c)nops指定取semoparray[]中前多少个数据来进行操作。
4)释放某个信号量:
intsemop(intsemid,structsembufsemoparray[],size_tnops)。
和申请相同,不过在结构体的sem_op中指定正数。
(3)主要头文件
(4)参考代码
unionsemun{
intval;
structsemid_ds*buf;
unsignedshort*array;
}arg;
intsem_creat(key_tkey)
{
unionsemunsem;
intsemid;
sem.val=0;
semid=semget(key,1,IPC_CREAT|0666);
if(-1==semid){
printf("createsemaphoreerror\n");
exit(-1);
}
semctl(semid,0,SETVAL,sem);
returnsemid;
}
voiddel_sem(intsemid)
{
unionsemunsem;
sem.val=0;
semctl(semid,0,IPC_RMID,sem);
}
//p
intp(intsemid)
{
structsembufsops={0,+1,IPC_NOWAIT};
return(semop(semid,&sops,1));
}
//v
intv(intsemid)
{
structsembufsops={0,-1,IPC_NOWAIT};
return(semop(semid,&sops,1));
}
intmain()
{
}
五、实验要求
自己写一个程序,练习信号量的使用。
六、思考题
1、信号量实现进程间互斥的原理是什么?
实验六linux内存基本原理
实验学时:
4学时
实验类型:
综合
实验要求:
必修
一、实验目的
掌握Linux环境下对内存管理的基本操作,感性认识Linux如何对内存进行管理。
二、实验内容
1.练习linux环境下对内存管理常用的操作
2.掌握基本内存操作的系统调用的使用
三、实验环境
一台已经安装好Linux操作系统的主机/或安装过vmware的windows系统。
四、实验步骤
1.显示内存信息
1)在命令行使用“Free”命令监控内存使用情况,并解释输出结果代表的含义
命令:
结果:
分析结果:
2)每5秒以字节为单位来显示内存的使用情况;
命令:
结果:
3)显示交换区的使用状况:
命令:
结果:
4)监视虚拟内存使用情况
命令:
结果:
分析结果:
2. Linux下交换文档的创建和使用
预备知识:
Linux的交换文档相当于Windows的虚拟内存,但是Linux能够使用整个分区做为交换空间,也能够像Windows相同使用单个的文档做虚拟内存。
Linux支持虚拟内存,就是使用磁盘作为RAM的扩展,使可用内存相应地有