Linux实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程编号:B080103040Linux操作系统实验报告姓名邵春晓学号20124670班级软工1201指导教师石凯实验名称Linux操作系统实验开设学期2014-2015第一学期实验时间第11周——第18周评定成绩评定人签字石凯评定日期东北大学软件学院实验一熟悉Linux环境【实验内容】一、练习常用的Shell命令。当用户登录到字符界面系统或使用终端模拟窗口时,就是在和称为shell的命令解释程序进行通信。当用户在键盘上输入一条命令时,shell程序将对命令进行解释并完成相应的动作。这种动作可能是执行用户的应用程序,或者是调用一个编辑器、GNU/Linux实用程序或其他标准程序,或者是一条错误信息,告诉用户输入了错误的命令。二、熟悉vim编辑器在编写文本或计算机程序时,需要创建文件、插入新行、重新排列行、修改内容等,计算机文本编辑器就是用来完成这些工作的。Vim编辑器的两种操作模式是命令模式和输入模式(如图2所示)。当vim处于命令模式时,可以输入vim命令。例如,可以删除文本并从vim中退出。在输入模式下,vim将把用户所输入的任何内容都当作文本信息,并将它们显示在屏幕上。三、熟悉gcc编译器GNU/Linux中通常使用的C编译器是GNUgcc。编译器把源程序编译生成目标代码的任务分为以下4步:a.预处理,把预处理命令扫描处理完毕;b.编译,把预处理后的结果编译成汇编或者目标模块;c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;d.连接,把多个目标代码模块连接生成一个大的目标模块;四、熟悉gdb调试工具LINUX包含了一个叫gdb的GNU调试程序。gdb是一个用来调试C和C++程序的强有力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。它具有以下一些功能:·监视程序中变量的值;·设置断点以使程序在指定的代码行上停止执行;·一行行的执行代码。五、掌握Linux下C程序编辑运行过程Linux下编写C程序要经过以下几个步骤:⑴启动常用的编辑器,键入C源程序代码。⑵编译源程序⑶运行可执行文件【实验总结】在学习linux的过程中间,最主要的就是耐心和细心。linux的命令很多,只有一遍一遍的看一次又一次的用,才能记住很多的命令,才能很好的使用linux。通过这次实验,我对linux的系统以及vim编辑器,gcc编译器,gdb调试工具更加熟悉,这也让我让我能够更加努力学习。实验二文件操作【实验内容】1.文件的创建(必做题)编写程序,实现cp命令的功能。被复制的文件名与复制出的新文件由用户指定。调用方法:“你编写的程序名被复制文件名复制出的文件名”。要求程序有一定的健壮性,即对用户错误调用及其他错误要有处理和反馈。(提示:可以使用man手册查看具体的系统调用,e.g.,man2open)。#includesys/types.h#includesys/stat.h#includefcntl.h#includestdio.h#includestdlib.hmain(intac,char*av[]){intfd1,fd2;intn;charbuf[512];if(ac!=3){printf(missingfileoperand\n);exit(1);}if((fd1=open(av[1],O_RDONLY))==-1){perror(cannotopen);exit(1);}if((fd2=creat(av[2],0777))==-1){perror(cannotcreat);exit(1);}while((n=read(fd1,buf,512))0){write(fd2,buf,n);}close(fd1);close(fd2);}2.查看目录内容及文件属性(1)编写程序,实现ls-l的功能。调用方法:“你编写的程序名”——这时打印出当前目录文件及其属性;“你编写的程序名目录名”——这时在终端显示给定目录下的文件及其属性。(提示:当用户给定目录后,需要改变进程的当前目录,可使用chdir()。)#includestdio.h#includesys/types.h#includedirent.h#includesys/types.h#includesys/stat.h#includeunistd.h#includestring.h#includepwd.h#includegrp.h#includetime.hvoidmode_to_str(mode_tmode,char*str){strcpy(str,----------);if(S_ISDIR(mode))str[0]='d';if(mode&0400)str[1]='r';if(mode&0200)str[2]='w';if(mode&0100)str[3]='x';if(mode&040)str[4]='r';if(mode&020)str[5]='w';if(mode&010)str[6]='x';if(mode&04)str[7]='r';if(mode&02)str[8]='w';if(mode&01)str[9]='x';}voidshow_file_info(char*filename){structstatbuf;charmodestr[10];stat(filename,&buf);mode_to_str(buf.st_mode,modestr);printf(%.10s\t,modestr);printf(%d\t,buf.st_nlink);printf(%s\t,getpwuid(buf.st_uid)-pw_name);printf(%s\t,getgrgid(buf.st_gid)-gr_name);printf(%d\t,buf.st_size);printf(%.12s\t,4+ctime((consttime_t*)&(buf.st_mtime)));printf(%s\n,filename);}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]!='.'){show_file_info(p-d_name);}}closedir(dirp);}3.设备文件操作在/dev目录下,找到你的鼠标对应的文件。打开这个文件,从该文件循环读出字符,并将字符对应的ascII代码在终端显示出来。【实验总结】通过这个实验,我学会了如何在编译器里操作文件,也学会了如何使用man手册。实验三进程间通信UNIX/LINUX系统的进程间通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉LINUX支持的信号量机制、管道机制、消息通信机制及共享存储区机制。(一)进程创建实验【实验内容】1.进程的创建编写一段程序,使用系统调用fork()创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。#includestdio.hmain(){intp1,p2;while((p1=fork())==-1);if(p1==0)putchar(‘b’);/*在子进程1中*/else/*在父进程中*/{while((p2=fork())==-1);if(p2==0)putchar(‘c’);/*在子进程2中*/else/*在父进程中*/putchar(‘a’);}}实验结果为:cb2.修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。参考程序#includestdio.hmain(){intp1,p2,i;while((p1=fork())==-1);if(p1==0)/*在子进程1中*/for(i=0;i500;i++)printf(“daughter%d\n”,i);else{while((p2=fork())==-1);If(p2==0)/*在子进程2中*/for(i=0;i500;i++)printf(“son%d\n”,i);elsefor(i=0;i500;i++)printf(“parents%d\n”,i);}}由于输出500的循环太大,无法看到全部结果,i分别采用3,10,100,当i为3时,是先输出3个“parentsi”,然后再输出3个“soni”,最后输出5个“daughteri”;当i为10时,结果与i为3一样;截图如下:但是当i为100时,是先输出100个“parentsi”,再输出“soni”但是在“soni”输出的同时,“daughtei”也开始输出,由于屏幕显示有限,图片就不粘贴了。当“parentsi”全部输出完之后,开始输出“soni”;在“soni”输出的过程中,也开始输出“daughteri”:最后输出完“daughteri”。当i为500时,“parenti”输出的时候,“soni”也开始输出,但整体上是“parenti”先输出完,然后是“soni”,最后是“daughteri”【思考题】1.系统是怎样创建进程的?答:linux系统创建进程都是用fork()系统调用创建子进程,在UNIX系统中,只有0进程是在系统引导时被创建的,在系统初启时由0进程创建1进程,以后0进程变成对换进程,1进程成为系统中的始祖进程。UNIX利用fork()为每个终端创建一个子进程为用户服务,如等待用户登录、执行SHELL命令解释程序等,每个终端进程又可利用fork()来创建其子进程,从而形成一棵进程树。可以说,系统中除0进程外的所有进程都是用fork()创建的。fork()函数被调用一次,但返回两次。如果fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程号2.当前运行的程序(主进程)的父进程是什么?答:当前运行的程序(主进程)的父进程是fork()出这个进程的进程,在UNIX系统中,只有0进程是在系统引导时被创建的,在系统初启时由0进程创建1进程,以后0进程变成对换进程,1进程成为系统中的始祖进程。【实验总结】通过本次实验,掌握了进程的概念,明确进程和程序的区别:通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件.而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现.一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去,而产生子孙进程.当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用.在系统里面只有进程没有程序;认识和了解并发执行的实质,即linux中内核并发机制也就是同步机制产生的原因,总的来说可归纳为一下4点:l中断——中断几乎可以在任何时刻异步发生,也就可能随时打断当前正在执行的代码;2睡眠及与用户空间的同步——在内核执行的进程可能会睡眠,这就会唤醒调度程序,从而导致调度一个新的用户进程执行;3对称多处理——两个或多个处理器可以同时执行代码;4内核抢占——因为内核具有抢占性,所以内核中的任务可能会被另一任务抢占(在2.6内核引进的新能力)。(二)信号量机制实验【实验内容】1.编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparen

1 / 36
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功