南京邮电大学操作系统实验报告文档格式.docx
《南京邮电大学操作系统实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《南京邮电大学操作系统实验报告文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![南京邮电大学操作系统实验报告文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/29/85b7e682-4032-497a-b9f8-4df7aafac1e6/85b7e682-4032-497a-b9f8-4df7aafac1e61.gif)
WindowsXP+VMWare+RedHatEnterpriseLinux(RHEL)4
三、实验原理及内容
1、熟悉LINUX的常用基本命令。
如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。
(1)显示目录文件ls
例:
ls-al显示当前目录下的所有文件
(2)建新目录mkdir
mkdirtest新建一个test目录
(3)删除目录 rmdir
(4)改变工作目录位置cd
cdtest更改工作目录至test目录下
(5)显示当前所在目录pwd
(6)查看目录大小du
(7)文件属性的设置chmod
(8)命令在线帮助man
2、设计一个实现文件拷贝功能的shell程序。
(1)在文本编辑器里输入shell程序:
#!
/bin/sh
echo“pleaseentersourcefile:
”
readsouc
echopleaseenterdestinationfile:
readdest
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就执行UNIXshell命令
(3)打开终端,输入gcchello.c,编译c程序。
(4)编译无错后,输入./a.out,运行程序hello.c,显示运行结果“hello”。
四、实验小结
之前没有接触过Linux操作系统,刚开始用有点不习惯。
虽然用起来磕磕绊绊,通过本次实验反而受益匪浅。
通过这个实验我了解了UNIX的命令及使用格式,熟悉了UNIX/LINUX的常用基本命令,同时也了解了在LINUX系统下运行C语言程序的方法,掌握了C语言程序的编译与调试方法。
试验二进程管理
1、掌握进程的概念,明确进程的含义
2、认识并了解并发执行的实质
三、实验原理及内容
1.实验内容
使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有两个父进程和两个子进程活动。
每一个进程在屏幕上显示为:
父进程1显示“
(1)parentpidsay:
A”,父进程2显示“
(2)parentpidsay:
A”,子进程(1.1)显示(1.1)pid1say:
B,子进程(2.1)显示“(2.1)pid2say:
C”。
2、实验原理
fork():
创建一个新进程。
系统调用格式:
pid=fork()
参数定义:
intfork()
fork()返回值意义如下:
0:
在子进程中,pid变量保存的fork()返回值为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)在文本编辑器输入程序:
#include<
stdio.h>
unistd.h>
intmain()
{
inttemp1,temp2;
intpid1,pid2;
pid1=fork();
temp1=pid1;
if(pid1>
0)
printf(“\n
(1)parentpid%dsay:
A”,temp1);
}
else
printf(“\n(1.1)pid1say:
B”);
pid2=fork();
temp2=pid2;
if(pid2>
printf(“\n
(2)parentpid%dsay:
A”,temp2);
printf(“\n(2.1)pid2say:
C”);
将程序保存在主目录下。
(2)打开终端,使用gcc编译程序,如果出错,使用vi编辑器编辑程序。
编辑无错后再次编译。
(3)运行程序,输入./a.out,运行多次后得到下图结果。
四、实验小结
通过这次实验,掌握了进程的概念,明确了进程的含义,认识并了解了并发执行的实质。
这次实验学会了用fork()函数创建实验,了解到进程与子进程的创建过程。
另外还掌握了LINUX系统中输出流重定向的使用,将程序的输出结果输出到文件中,而不是直接显示在屏幕上。
试验三进程间通信
综合
3
2016.6.2,2016.6.9
1、掌握进程另外的创建方法。
2、熟悉进程的睡眠、同步、撤消等进程控制方法。
3、了解什么是管道。
4、熟悉UNIX/LINUX支持的管道通信方式。
1.实验原理
编写程序实现进程的管道通信。
用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:
Child1issendingamessage!
Child2issendingamessage!
父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。
2.实验步骤
#include<
signal.h>
main()
{
intfd[2];
charoutpipe[100],inpipe[100];
pipe(fd);
/*创建一个管道*/
while((pid1=fork())==-1);
if(pid1==0)
{
lockf(fd[1],1,0);
sprintf(outpipe,"
child1processissendingmessage!
"
);
/*把串放入数组outpipe中*/
write(fd[1],outpipe,50);
/*向管道写长为50字节的串*/
sleep(5);
/*自我阻塞5秒*/
lockf(fd[1],0,0);
exit(0);
}
{
while((pid2=fork())==-1);
if(pid2==0)
{lockf(fd[1],1,0);
/*互斥*/
child2processissendingmessage!
write(fd[1],outpipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
else
{wait(0);
/*同步*/
read(fd[0],inpipe,50);
/*从管道中读长为50字节的串*/
printf("
%s\n"
inpipe);
wait(0);
printf("
exit(0);
(2)在终端中,编译程序。
(3)输入./a.out执行程序
3、实验结果
实验输出结果如下
延迟5秒后显示
再延迟5秒
child2processissendingmessage!
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
通过这次实验,熟悉了进程的睡眠、同步、撤消等进程控制方法,了解什么是管道,了解了UNIX/LINUX支持的管道通信方式。
实验四文件的操作和使用
2016.6.9
熟悉文件系统的操作和使用方法。
1、实验内容
设计一个程序,通过用密码字符串对文件内容进行逐字符异或操作的方法,实现对一个文件的加/解密。
2、实验步骤
(1)实验程序:
intmain(intargc,char*argv[])
FILE*fd1,*fd2,*fd3;
intn;
charjiami[4];
jiami[0]=’1’;
jiami[1]=’2’;
jiami[2]=’3’;
jiami[3]=’4’;
intk=0;
chartemp;
fd1=fopen(“hello.c”,”r”);
//源文件hello.c
fd2=fopen(“B13011206”,”w”);
//加密后文件B13011206
while((n=fgetc(fd1))>
n=n^jiami[k];
k++;
if(k>
=4)
k=0;
fputc(n,fd2);
fclose(fd1);
fclose(fd2);
(2)打开终端,使用gcc编译,vi编译程序。
生成可执行文件4。
(3)输入./4hello.caaa,对hello.c程序加密并保存至aaa
(4)使用vi指令进入hello.c和aaa,前者为加密前,后者为加密后程序。
3、实验结果:
B13011206中的内容
_[]W]GWQ_AGPX]_\_8_]_Q_AUW_GEV_]S_[_;
[]@__R]___>
J8CFX\GR__[Q]^\_m\__
8AQEGAZ___>
L8
通过本次实验,我将课本上的理论知识应用于实践,加深了对操作系统基本概念的理解。
在实验过程中,查询了不少相关资料,不断的发现问题、提出问题、解决问题。
在对自己所编写的源程序段的纠错的过程中,使我更好的理解了操作系统中文件系统的理论知识。
这几次操作系统的实验让我学到很多,不仅仅是加深了我对理论知识的印象,更重要的是能够将理论知识应用于实践。
希望以后的专业课程都能够开设一定的实践课程,亲自实践跟书本学习真的是完全不同的两种感受。
最后,感谢老师的耐心教导和实验指导,这次实验我收获了很多。
指导教师评语
成绩
批阅人
日期