资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验课程:操作系统阜阳师范学院Fuyang Teachers College 实验报告=专业: 年级班级: 学年 第 学期姓名 学号: 实 验 报 告实验项目 实验一:Linux 入门1) 了解 Linux 运行环境的命令及使用格式 2) 熟悉 Linux 的常用基本命令实验目的3) 练习并掌握 Linux 下 C 语言程序的编写、编译、调试和运行方法。实验器材 PC、虚拟机1) 熟悉 Linux 的常用基本命令如logout/exit、adduser、userdel、ls、cd、pwd、mkdir、rmdir、rm、cp、mv、cat、man 等。实验内容2) 用 vi 编写一个简单的显示“hello word!”的程序,用 gcc 编译并观察编译后的结果,运行生成的可执行文件。实验要求 记录自己实验课上具体的操作内容、过程实验原理(指导)(一) 介绍虚拟机安装以及使用方法利用软件技术,在母机 hosts 中虚拟出另外一台或者几台子机 guests,而在子机中,可以随意进行任何操作,并且都不会影响主机。Vmware 中创建的 OS 实际上是在硬盘上创建了一个文件夹,该 OS 中的所有东西都保存在这个文件夹中的文件里面。设置共享的路径:Windows: d:lin_shareLinux: /mnt/hgfs/sharefolders/(二) 常用基本命令的使用用 root 账号(超级用户)注册,口令为 redhat(注意大小写) 。注册成功出现#号(超级用户系统提示符,普通用户的系统提示符为$) 。命令格式:命令 选项 处理对象注意:(1)命令一般是小写字串。注意大小写有别(2)选项通常以减号(-)再加上一个或数个字符表示,用来选择一个命令的不同操作(3)同一行可有数个命令,命令间应以分号隔开(4)命令后加上&可使该命令后台(background)执行命令名 功能 实例命令 功能 实例(三)使用编辑器 vi 编辑文件vi 提供二种工作模式:输入模式(insert mode)和命令模式(command mode) 。1. 进入 Linux 的文本模式之后,在命令行键入 vi filename.c 然后回车。首先 vi 命令是打开 vi 编辑器。后面的 filename.c 是用户即将编辑的 c 文件名字,注意扩展名字是.c;也可以直接用 vi 打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2. 最基本的命令 I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的 I 键( insert) ,插入的意思,就可以进入编辑模式了(a 与 i 是相同的用法)3. 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键盘上的 Esc 键;2)键入冒号(:) ,紧跟在冒号后面是 wq(意思是保存并退出) 。如果不想保存退出,则在第二步键入冒号之后,键入!q(不带 w,机尾部保存) 。4. 在输入模式下,按 ESC 可切换到命令模式。命令模式下,可选用下列指令离开 vi:q! 离开 vi,并放弃刚在缓冲区内编辑的内容:wq将缓冲区内的资料写入磁盘中,并离开 vi:ZZ同 wq:x 同 wq:w 将缓冲区内的资料写入磁盘中,但并不离开 vi:q 离开 vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w 配合使用5. 退出 vi 编辑器的编辑模式之后,要对刚才编写的程序进行编译(四)GNU C 编译器Linux 上可用的 C 编译器是 GNU C 编译器。通常后跟一些选项和文件名来使用GCC 编译器。 GCC 命令的基本用法如下: gcc options filenames。当不用任何选项编译一个程序时,GCC 将建立(假定编译成功)一个名为 a.out的可执行文件。也可用-o 选项来为即将产生的可执行文件指定一个文件名来代替 a.out。例如:gcc o count count.c 此时得到的可执行文件就不再是a.out,而是 count。最后一步是运行程序,执行文件 格式: ./可执行文件名(五)GDB 调试工具gdb 是一个用来调试 C 和 C+程序的强有力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。在编译时用 g 选项打开调试选项。命 令 描 述file 装入欲调试的可执行文件kill 终止正在调试的程序list 列出产生执行文件的源代码部分next 执行一行源代码但不进入函数内部step 执行一行源代码并进入函数内部run 执行当前被调试的程序quit 终止 gdbbreak 在代码里设置断点,使程序执行到这里时被挂起make 不退出 gdb 就可以重新产生可执行文件shell 不离开 gdb 就执行 UNIX shell 命令实验过程【任务】: 编写一简单程序,对其编译、调试并执行程序体实验结果及分析注意事项实验小结教师评语 实验成绩教师签名 实验日期实 验 报 告实验项目 实验二:Linux 进程控制1) 加深对进程概念的理解,明确进程和程序的区别; 2) 进一步认识并发执行的概念,区别顺序执行和并发执行;3) 掌握进程创建的方法4) 熟悉进程的睡眠,同步和撤销等进程控制方法实验目的5) 分析进程争用临界资源的现象,学习解决进程互斥的方法;实验器材 PC、虚拟机1) 编写一段程序,使用系统调用 fork()创建两个子进程。各进程显示不同的信息,如父进程显示字符“a” ,子进程分别显示字符“b”和“c” 。多次运行观察显示结果,并分析产生这种执行效果的原因。2) 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因3) 一个父进程创建一个子进程,子进程通过 exec 系统调用执行另一个文件。各自的代码中显示不同的信息,从其运行结果可看出两个进程并发执行的效果。4) 利用 wait()来控制进程执行顺序,并用 exit()来终止进程执行,分析 wait( )是如何实现进程同步的实验内容5) 选作:如果在程序中使用调用 lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。1) 仔细观察实验中的各种现象及出现的问题。分析产生各种现象的原因。寻找解决问题的办法。实验要求 2) 实验报告中给出程序的主要语句并且加入相应的注释即可,程序太多时不需要给出程序的全部语句,给出输出的结果及对各种现象的分析意见实验原理(指导)(一)所涉及的系统调用函数名 功能 调用格式1fork( ) 创建一个新进程。 Int pid=fork( )说明:fork( )返回值意义如下:0:在子进程中,pid 变量保存的 fork( )返回值为 0,表示当前进程是子进程。0:在父进程中,pid 变量保存的 fork( )返回值为子进程的 id 值(进程唯一标识符) 。-1:创建失败。如果 fork( )调用成功,它向父进程返回子进程的 PID,并向子进程返回 0,即fork( )被调用了一次,但返回了两次。函数名 功能 调用格式2getpid( ) 取得目前进程的识别码(进程 ID) , int getpid()3getppid( ) 取得目前进程的父进程识别码 int getppid()说明:头文件 #include函数名 功能 调用格式4execl ( ) 把一个新程序装入内存,来改变调用进程的执行代码,从而形成新进程int execl(path,arg0,arg1,.argn,0);char *path,*arg0,*arg1,.,*argn;说明:如果 exec( )调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新进程,新进程的进程标识符 id 与调用进程相同, exec( )没有建立一个与调用进程并发的子进程,而是用新进程取代了原来进程。系统调用 exec 和 fork( )联合使用能为程序开发提供有力支持。用 fork( )建立子进程,然后在子进程中使用 exec( ),这样就实现了父进程与一个与它完全不同子进程的并发执行。头文件: #include函数名 功能 调用格式5wait ( ) 等待子进程运行结束int wait(status)int *status;其中,status 是用户空间的地址。说明:如果子进程没有完成,父进程一直等待。wait( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在 wait( )前已有子进程暂停或终止,则调用进程做适当处理后便返回函数名 功能 调用格式6exit( ) 终止进程的执行void exit(status)int status;其中,status 是返回给父进程的一个整数,说明:exit(0)正常终止;exit(1)异常终止函数名 功能 调用格式7lockf(files,function,size)用作锁定文件的某些段或者整个文件。int lockf(files,function,size)int files,function;long size;其中:files 是文件描述符;function是锁定和解锁:1 表示锁定,0 表示解锁。size 是锁定或解锁的字节数,为 0,表示从文件的当前位置到文件尾。(二) 进程创建程序实示例:#include main() int p;while(p=fork()= -1); /*进程创建失败*/if(p=0)printf(“This is a child process.”); /*在子进程中*/else Printf(“This is a parent process.”); /*在父进程中*/ 实验过程【子任务 1】: 使用系统调用函数 fork( )创建子进程,用 getpid( )获取父子进程的ID 号,用 getppid( )获取子进程的父进程的 ID,记录实验结果,观察并分析它们之间的关系。程序体实验结果及分析【子任务 2】: 修改程序,用 fork( )建立子进程,然后在子进程中使用 execl( ),记录实验结果,并对实验结果进行分析系统调用函数 excel( )的工作原理。程序体实验结果及分析【子任务 3】: 修改程序,编写一段程序,使用系统调用 fork()创建两个子进程。各进程显示不同的信息。多次运行观察结果,分析执行效果的原因,说明进程并发执行的特点。程序体实验结果及分析【子任务 4】: 修改程序,使用系统调用 wait( )、exit( )和 sleep( ),实现简单的进程同步,多次运行观察结果,分析执行效果的原因,说明如何使得进程实现简单的同步。程序体程序体实验结果及分析注意事项实验小结教师评语 实验成绩教师签名 实验日期实 验 报 告实验项目 实验三:Linux 进程通信4) 了解什么是信号以及熟悉 Linux 系统中进程之间软中断通信的基本原理5) 了解什么是管道以及熟悉 Linux 支持的管道通信方式实验目的6) 了解什么是消息以及熟悉消息传送的机理实验器材 PC、虚拟机任务一:进程的软中断通讯任务二:进程的管道通信实验内容任务三:消息通信实验原理(指导)(一)所涉及的系统调用函数名 功能 调用格式1kill( ) 发送者进程发送信号。 int
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号