南京邮电大学操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通信与信息工程学院
2015 / 2016学年第二学期
实验报告
课程名称:操作系统
实验名称:
1、LINUX及其使用环境
2、进程管理
3、进程间通信
4、文件的操作和使用
班级学号
专业电子信息工程
学生姓名
指导教师赵建立
实验名称试验一 LINUX及其使用环境实验类型验证
实验学时 1 实验时间2016.6.2 一、实验目的和要求
1、了解UNIX的命令及使用格式。
2、熟悉UNIX/LINUX的常用基本命令。
3、练习并掌握UNIX提供的vi编辑器来编译C程序。
4、学会利用gcc、gdb编译、调试C程序。
二、实验环境
Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4
三、实验原理及内容
1、熟悉LINUX的常用基本命令。如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。
(1)显示目录文件 ls
例:ls -al 显示当前目录下的所有文件
(2)建新目录 mkdir
例:mkdir test 新建一个test目录
(3)删除目录rmdir
(4)改变工作目录位置 cd
例:cd test 更改工作目录至test目录下
(5)显示当前所在目录pwd
(6)查看目录大小du
(7)文件属性的设置 chmod
(8)命令在线帮助 man
2、设计一个实现文件拷贝功能的shell程序。
(1)在文本编辑器里输入shell程序:
#!/bin/sh
echo “please enter source file:”
read souc
echo please enter destination file:”
read dest
cp $souc $dest
ls $dest
将程序保存在主目录下,命名为shell.
(2)打开终端,输入ls -l,显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称。输入./shell,运行shell程序。输入源文件hello.c,目标文件
B13011206.c。
(3)输入ls -l ,当前目录中包含B13011206.c目标文件。即完成从源文件拷贝至目标文件过程。
3、LINUX 下C语言程序的编译与调试实验。
(1)调试编译代码
为了使gdb正常工作,必须使程序在编译时包含调试信息。调试信息里包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联,在编译时用–g 选项打开调试选项。
(2)gdb基本命令
命令描述
file 装入欲调试的可执行文件
kill 终止正在调试的程序
list 列出产生执行文件的源代码部分
next 执行一行源代码但不进入函数内部
step 执行一行源代码并进入函数内部
run 执行当前被调试的程序
quit 终止gdb
watch 监视一个变量的值而不管它何时被改变
break 在代码里设置断点,使程序执行到这里时被挂起
make 不退出gdb就可以重新产生可执行文件
shell 不离开gdb就执行UNIX shell 命令
(3)打开终端,输入gcc hello.c,编译c程序。
(4)编译无错后,输入 ./a.out ,运行程序hello.c,显示运行结果“hello”。四、实验小结
之前没有接触过Linux操作系统,刚开始用有点不习惯。虽然用起来磕磕绊绊,通过本次实验反而受益匪浅。通过这个实验我了解了UNIX的命令及使用格式,熟悉了UNIX/LINUX的常用基本命令,同时也了解了在LINUX系统下运行C语言程序的方法,掌握了C语言程序的编译与调试方法。
实验名称试验二进程管理实验类型验证
实验学时 1 实验时间2016.6.2
一、实验目的和要求
1、掌握进程的概念,明确进程的含义
2、认识并了解并发执行的实质
二、实验环境
Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4
三、实验原理及内容
1.实验内容
使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有两个父进程和两个子进程活动。每一个进程在屏幕上显示为:父进程1显示“(1)parent pid say:A”,父进程2显示“(2)parent pid say:A”,子进程(1.1)显示(1.1)pid1 say:B,子进程(2.1)显示“(2.1)pid2 say:C”。
2、实验原理
fork( ):创建一个新进程。
系统调用格式: pid=fork( )
参数定义:int fork( )
fork( )返回值意义如下:
0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。
>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。
-1:创建失败。
如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )
被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程的副本,称为子进程。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。
核心为fork( )完成以下操作:
(1)为新进程分配一进程表项和进程标识符
进入fork( )后,核心检查系统是否有足够的资源来建立一个新进程。若资源不足,则fork( )系统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。
(2)检查同时运行的进程数目
超过预先规定的最大数目时,fork( )系统调用失败。
(3)拷贝进程表项中的数据
将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建”状态。
(4)子进程继承父进程的所有文件
对父进程当前目录和所有已打开的文件表项中的引用计数加1。
(5)为子进程创建进程上、下文
进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。
(6)子进程执行
虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC,然后根据pid变量保存的fork( )返回值的不同,执行不同的分支语句。
3.实验步骤
(1)在文本编辑器输入程序: