Linux操作系统实验报告.docx
- 文档编号:24275802
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:49
- 大小:576.13KB
Linux操作系统实验报告.docx
《Linux操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《Linux操作系统实验报告.docx(49页珍藏版)》请在冰豆网上搜索。
Linux操作系统实验报告
Linux操作系统
实验报告
姓名
学号
班级
指导教师
实验名称
Linux操作系统实验
开设学期
2015-2016第一学期
开设时间
第11周——第18周
报告日期
2015年11月13日
评定成绩
评定人
评定日期
实验报告一熟悉Linux环境
【实验目的】
1.了解Linux系统基本操作方法,学会独立使用该系统。
2.熟悉Linux下如何编辑、编译和运行一个C语言程序。
3.学会利用gcc、gdb编译、调试C程序。
【报告内容】
一、常用的Shell命令
1.目录操作
根据实际操作,其命令执行的书写形式和简略内容如下:
(1)使用mkdir命令创建一个目录abc
[qdf@localhost~]$mkdirabc
(2)使用cd命令将工作目录改变到abc
[qdf@localhost~]$cdhahaabc
(3)使用cd命令改变当前目录到主目录qdf
[qdf@localhost~]$cdabcqdf
(4)使用ls命令列出当前目录的内容
(5)使用ls-l命令输出当前目录内容的长列表
(6)使用pwd命令显示当前目录的全路径
2.文件显示实用程序
根据实际操作,其命令执行的书写形式和简略内容如下:
(1)使用vi命令编写程序mx.c
[qdf@localhost~]$vimx.c
(2)使用cat命令显示mx.c文件内容
(3)使用more命令分屏显示mx.c内容
(4)使用cat命令连接file1和file2
[qdf@localhost~]$vifile1file2
[qdf@localhost~]$catfile1file2
abcdef
123456
3.文件管理实用程序
根据实际操作,其命令执行的书写形式和简略内容如下:
(1)使用cp将文件1复制到文件2
[qdf@localhost~]$cpfile1file2
[qdf@localhost~]$catfile2
abcdef
(2)使用mv命令将文件file1重命名为file2
[qdf@localhost~]$catfile1
A-B-C-D-E-F-G
[qdf@localhost~]$mvfile1file2
[qdf@localhost~]$catfile2
A-B-C-D-E-F-G
(3)使用rm命令删除文件filename
[qdf@localhost~]$rmfilename
[qdf@localhost~]$catfilename
cat:
file2:
没有那个文件或目录
4.数据操作实用程序
根据实际操作,其命令执行的书写形式和简略内容如下:
(1)使用tty命令显示当前终端的路径和文件名
[qdf@localhost~]$tty
/dev/pts/6
(2)使用who命令显示当前登录用户的列表
5.其他实用程序
根据实际操作,其命令执行的书写形式和简略内容如下:
(1)使用date命令输出系统日期和时间
[qdf@localhost~]$date
2014年12月01日星期一09:
12:
50CST
(2)使用history命令显示以前执行过的命令的列表
二、Linux下C程序编辑运行过程
1.Linux下编写C程序编辑运行过程的步骤
命名C程序为hello.c,同时启动vi编辑器,并键入C源程序代码,具体如下:
#include
voidmain(void)
{
printf(“Helloworld\n”);
}
编译源程序,即用gcc编译器对hello.c进行编译,以生成hello.out。
方法如下:
gcc-ohello.outhello.c↙
键入一条指令,运行hello.out。
./hello.out↙
2.Linux下C程序编辑运行命令执行的形式和内容
[qdf@localhost~]$vihello.c
[qdf@localhost~]$gcc-ohello.outhello.c
[qdf@localhost~]$./hello.out
Helloworld
[qdf@localhost~]$
三、实验心得总结
刚开始由对Linux基本不了解到能独立安装Linux虚拟机以及可以独立编写一些简单的shell命令,我认为这就是一种进步。
本次实验共四学时,实验期间对Linux系统基本操作方法有了深入的了解,进一步巩固了常用的shell命令,如显示文件内容的命令:
cat、more、less、head、tail;文件的创建与删除的命令:
mkdir、rmdir;改变工作目录、显示路径以及显示目录内容的命令:
cd、pwd、ls等等。
此外,在具体的实验内容指导下,能熟悉地利用vi命令打开编辑器(如vihello.c命令就是编辑一个名为hello.c的C源程序),更改所编写的文本或计算机程序的文件名或目录名(如cdf1f2就是将f1文件名更改为f2),修改其内容或删除已建的文件或目录(如rmhello.c就是删除名为hello.c源程序文件),同时熟悉了在Linux系统下如何编辑、编译和运行一个C语言程序。
实验报告二文件操作
【实验目的】
1.掌握文件的概念及对文件的操作。
2.掌握对目录及文件系统的操作。
3.掌握对设备文件的操作。
【报告内容】
一、文件的创建
1.使用vi命令编写程序read.c
main(intac,char*av[]){
intfd;
intn;
charbuf[]=[512];
fd=open(av[1],O_RDONLY);
while((n=read(fd,sizeof,buf,sizeof(buf)))>0)
printf(“%.*s\n”,n,buf);
close(fd);
}
2.实现cp命令的功能
二、查看目录内容及文件属性
1.编写程序,实现ls-l的功能
(1)使用vi命令编写程序lsone.c:
main(intac,char*av[]){
DIR*dirp;
structdirent*p;
if(1==ac){
dirp=opendir(".");
}else{
dirp=opendir(av[1]);
}
while((p=readdir(dirp))!
=NULL){
if(p->d_name[0]!
='.'){
printf("%s\n",p->d_name);
}
}
closedir(dirp);
}
(2)实现ls-l的功能。
2.编写程序,实现ls-R的功能
(1)编写程序open.c:
main(intac,char*av[]){
intfd;
intn;
charbuf[512];
fd=open(av[1],O_RDONLY);
while((n=read(fd,buf,512))>0){
printf("%.*s",n,buf);
}
close(fd);
}
(2)实现ls-R的功能
[qdf@localhost~]$ccopen.c
[qdf@localhost~]$./a.out
[qdf@localhost~]$
[qdf@localhost~]$ls-Ropen.c
open.c
三、设备文件操作
1.在/dev目录下,查找鼠标对应的文件
2.打开这个文件,并循环读出字符,且将字符对应的ascII代码显示在终端上
(1)使用vi命令编写程序readmice.c
main(intac,char*av[]){
intfd;
charbuf[512];
intn;
fd=open("/dev/input/mice",O_RDONLY);
while((n=read(fd,&buf,sizeof(buf)))>0)
printf("%d.*s\n",n,buf);
close(fd);
}
四、程序设计思路和方法
1.使用vi命令编写程序read.c创建文件,使用cp命令将程序read.c重命名为readcp.c,实现文件的复制。
2.使用vi命令编写程序lsone.c,使用ls-l命令分别实现打印出当前目录文件及其属性和在终端显示给定目录下的文件及其属性。
使用mkdir命令创建目录ls1。
3.使用vi命令编写程序open.c,使用ls-R命令查看目录内容及文件属性。
4.使用ls命令查找鼠标对应的文件,并打开文件,将循环读出的字符对应的ascII代码显示在终端上。
五、实验总结
本次实验应用到了vi命令、cp命令、ls-l命令、mkdir命令、ls-R命令等等,分别实现了文件的创建、文件的复制、打印出当前目录文件及其属性以及在终端显示给定目录下的文件及其属性。
在上机过程中偶尔会出现代码命令输入错误的情况,以致没有达到实验目的。
不过,这是由于不细心导致的结果,因此我又重新输入命令,最后成功达到实验目的。
此外在上机准备实现设备文件操作的功能时,由于不熟悉操作流程,进入误区,幸好在笔记上记录了使用ls命令将鼠标对应的文件显示在终端上。
总之,本次实验收获很多,对Linux文件操作也有了很大程度的掌握。
实验报告三进程间通信
UNIX/LINUX系统的进程间通信机构(IPC)允许在任意进程间大批量地交换数据。
本实验的目的是了解和熟悉LINUX支持的信号量机制、管道机制、消息通信机制及共享存储区机制。
(一)进程创建实验
【实验目的】
1.掌握进程的概念,明确进程和程序的区别。
2.认识和了解并发执行的实质。
3.分析进程争用资源的现象,学习解决进程互斥的方法。
【报告内容】
一、进程的创建
1.进程的创建
(1)使用vi命令编写程序forkcp1.c:
#include
main()
{intp1,p2;
while((p1=fork())==-1);
if(p1==0)
putchar('B');
else
{while((p2=fork())==-1);
if(p2==0)
putchar('C');
else
putchar('A');
}
}
(2)运行结果:
(3)分析原因:
从进程执行并发来看,输出ABC的排列都是有可能的。
因为fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出ABC的排列都是有可能的。
2.进程的创建
(1)使用vi命令编写程序forkcp2.c:
#include
main()
{intp1,p2,i;
while((p1=fork())==-1);//创建子进程p1
if(p1==0)
for(i=0;i<500;i++)
printf(“daughter:
%d\n”,i);
else
{while((p2=fork())==-1);//创建子进程p2
if(p2==0)
for(i=0;i<500;i++)
printf(“son:
%d\n”,i);
else
for(i=0;i<500;i++)
printf(“parents:
%d\n”,i);//父进程执行
}
}
(2)运行结果:
[qdf@localhost~]$ccforkcp2.c
[qdf@localhost~]$./a.out
(3)分析原因:
随着执行时间不同,输出结果的顺序有所不同。
因为函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。
但是,进程中的循环会由于进程被中断而中断。
同程序forkcp1.c一样,多进程是随机的,所以输出的字符串的顺序会有不同的结果。
二、程序设计思路和方法
(1)本程序设计思路为当进程在屏幕上显示字符时,父进程显示字符“A”,子进程分别显示字符“B”和“C”。
于是编写名为forkcp1.c的程序,使用系统调用fork()方法创建两个子进程,分别命名为p1、p2。
(2)用cp命令将程序forkcp1.c复制为forkcp2.c,使用系统调用fork()方法创建两个子进程不变,只将程序forkcp1.c中每个进程的输出由单个字符改为一句话,通过相应的for循环语句和printf()语句显示在屏幕上。
三、思考题
1.系统是怎样创建进程的?
答:
系统通过调用fork函数创建进程,当一个进程调用了fork以后,系统会创建一个子进程。
这个子进程除了它的进程ID和父进程ID不同之外,其他的都一样。
在子进程与父进程各自执行自己的操作时,至于先执行子进程,还是先执行父进程,取决于去内核的调度算法。
一旦子进程被创建,父子进程相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait。
2.当前运行的程序(主进程)的父进程是什么?
(1)forkcp1.c程序中putchar('A')为父进程。
(2)forkcp2.c程序中printf(“parents:
%d\n”,i)为父进程。
四、实验总结
本次实验主要使用系统调用fork()方法创建两个进程,由于多进程是随机的,因此在实验过程中显示在终端上的结果不唯一。
开始我以为代码有问题呢,但经过分析和多次调试发现是因为多进程具有随机性。
实验过程中,我掌握了使用系统调用fork()方法创建进程,对系统怎样创建进程以及怎样确定当前程序父进程都有了一定程度的了解。
(二)信号量机制实验
【实验目的】
1.了解什么是信号。
2.熟悉LINUX系统中进程之间软中断通信的基本原理。
【报告内容】
一、软中断通信
1.编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止:
Childprocess1iskilledbyparent!
Childprocess2iskilledbyparent!
父进程等待两个子进程终止后,输出以下信息后终止:
Parentprocessiskilled!
(1)使用vi命令编写程序fork_kill.c:
voidmain()
{intp1,p2;
while((p1=fork())==-1);
if(p1>0)/*在父进程中*/
{//
while((p2=fork())==-1);
if(p2>0)/*在父进程中*/
{//
signal(SIGINT,stop);/*接收键盘中断(按Ctrl+C键),转stop*/
wait_mark=1;
waiting(0);/*若无按键将等待*/
kill(p1,10);/*向进程1发送信号*/
kill(p2,12);/*向进程2发送信号*/
wait();
wait();
printf(“parentprocessiskilled!
\n”);
exit(0);
}
else/*在子进程2中*/
{
wait_mark=1;
signal(12,stop);
waiting();
lockf(1,1,0);
printf(“childprocess2iskilledbyparent!
\n”);
lockf(1,0,0);
exit(0);
}
}
else/*在子进程1中*/
{
wait_mark=1;
signal(10,stop);
waiting();
lockf(1,1,0);
printf(“childprocess1iskilledbyparent!
\n”);
lockf(1,0,0);
exit(0);
}
}
voidwaiting()
{
while(wait_mark!
=0);
}
voidstop()
{
wait_mark=0;
}
(2)运行结果:
(3)分析原因:
进程的软中断通信是利用函数signal()和kill()来实现的,子进程中的signal()函数接收父进程kill()函数发来的信号来执行输出终止操作。
父进程中的signal(SIGINT,stop)是用来启动按键(Ctrl+C)的,用来发送终止子进程的信号。
实验结果如
(2)运行结果所示。
(4)如果把signal(SIGINT,stop)放在
号和
号位置,结果会怎样并分析原因。
答:
如果把signal(SIGINT,stop)放在
(1)号和
(2)号位置后,结果先输出childprocess2iskilledbyparent!
然后输出parentprocessiskilled!
而不会输出childprocess1iskilledbyparent!
因为在fork子进程1后,子进程1中没有设置对SIGINT信号的处理,当按下CTRL+C后,进程1默认为终止,所以没有输出。
(5)该程序段前面部分用了两个wait(0),为什么?
答:
该程序段前面部分用了两个wait(0),用两个wait(0)的作用是同时使两个子进程p1和p2发出软中断信号,而不用等待。
(6)该程序段中每个进程退出时都用了语句exit(0),为什么?
答:
该程序段中每个进程退出时都用了语句exit(0),表示要结束进程,另外向父进程返回结束标志0。
2.修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象。
(1)使用vi命令编写程序fork_kill2.c:
voidInt1()
{
printf(“childprocess1iskilledbyparent!
\n”);
exit(0);
}
voidInt2()
{
printf(“childprocess2iskilledbyparent!
\n”);
exit(0);
}
main()
{
intexitcode;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((pid1=fork())==-1);
if(pid1==0)
{
signal(SIGUSR1,Int1);
signal(SIGINT,SIG_IGN);
pause();
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
signal(SIGUSR2,Int2);
signal(SIGINT,SIG_IGN);
pause();
exit(0);
}
else
{
signal(SIGINT,IntDelete);
waitpid(-1,&exitcode,0);/*等待任何子进程中断或结束*/
printf(“parentprocessiskilled\n”);
exit(0);
}
}
}
(1)运行结果:
(3)分析原因:
signal(SIGQUIT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略键入信号和忽略中断信号。
在子进程中开始添加signal(SIGQUIT,SIG_IGN)时,子进程会忽略键盘软中断信号,此时按Ctrl+C不会将子进程终止,程序仍正常运行,而在子进程中开始添加signal(SIGQUIT,SIG_IGN)时,相应的中断信号会被忽略。
二、流程图
三、实验总结
通过本次实验,我加深了对进程间通信这部分知识的认识。
在实验过程中,我知道了怎样使用kill()和signal()两个系统调用实现了软中断,其中signal()预置对信号的处理方式,允许调用进程控制软中断信号,并了解到wait_mark的作用,waitpid()会暂停目前进程的执行,直到有信号来到或子进程结束,exit()终止进程的执行。
同时,我也知道了进程在前台和后台间切换和向后台进程发送信号的方法。
但由于带较多的新接触的系统调用,导致一些程序读起来有一点困难,在阅读该程序过程中,我感觉应当要注意程序的运行顺序,只有理解程序是如何运行的,才能真正掌握进程通信的本质。
(三)进程的管道通信实验
【实验目的】
1.了解什么是管道
2.熟悉UNIX/LINUX支持的管道通信方式
【报告内容】
一、进程的管道通信
1.编制一段程序,实现进程的管道通信。
使用pipe()建立一条管道线。
两个子进程pid1和pid2分别向管道各写一句话:
Child1issendingmessage!
Child2issendingmessage!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
(1)使用vi命令编写程序pipe0.c:
main()
{
intfd[2];
charOutPipe[100],InPipe[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0)
{
lockf(fd[1],1,0);
sprintf(OutPipe,“child1issendingmessage!
”);
/*把串放入数组outpipe中*/
write(fd[1],OutPipe,50);/*把串放入数组outpipe中*/
sleep(5);/*自我阻塞5秒*/
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
lockf(fd[1],1,0);/*互斥*/
sprintf(OutPipe,“child2issendingmessage!
”);
write(fd[1],OutPipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 操作系统 实验 报告