操作系统实验报告finalEDI汇总Word下载.docx
- 文档编号:7470067
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:23
- 大小:122.34KB
操作系统实验报告finalEDI汇总Word下载.docx
《操作系统实验报告finalEDI汇总Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告finalEDI汇总Word下载.docx(23页珍藏版)》请在冰点文库上搜索。
2.熟悉vi的操作环境和切换方法
3.掌握vi操作的方式(几个常用键)
4.了解常用的快捷键
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
VI编辑器的常见命令:
vi
filename
:
打开或新建文件,并将光标置于第一行首
+n
:
打开文件,并将光标置于第n行首
+
打开文件,并将光标置于最后一行首
+/pattern
filename:
打开文件,并将光标置于第一个与pattern匹配的串处
-r
在上次正用vi编辑时发生系统崩溃,恢复filename
filename....filename
打开多个文件,依次进行编辑
键盘命令:
1.cat,more,less命令
2.Is命令
3.cp命令
4.rm命令
5.mv命令
VI命令:
1.vi进入vi缓冲区
2.vifile1:
进入文件file1
3.退出vi
三、主要仪器设备及耗材
Ubuntu操作体统
Vi编辑器
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
1使用mkdir命令建立一个子目录subdir
$mkdirsubdir
$
2使用cat或more命令查看file1文件的内容。
$catfile1
SatMar1721:
25:
14CST2012
3将date命令的用法附加到文件file1的后面:
mandate>
>
file1
$mandate>
file1
4利用ls-lfile1命令列出文件file1的较详细的信息。
$ls-lfile1
-rw-rw-r--1ml2010ml20105690Mar1721:
28file1
5利用rmfa命令将文件fa删除。
$rmfa
$ls-l
total12
6运行mvfile1file_a命令,然后用ls命令查看这两个文件是否都还在工作目录中?
[ml2010@tansubdir]$mvfile1file_a
[ml2010@tansubdir]$ls
file_a
[ml2010@tansubdir]$
显然,只有file_a在工作目录中,而file1不在工作目录中
vi共分为三种模式
(1)命令模式:
命令模式为vi的初始模式,可以使用“上下左右”按键来移动光标,您可以使用“删除字符”或“删除整行”来处理文档。
在编辑模式或指令列模式中按【ESC】键可换回命令模式。
(2)编辑模式:
在命令模式中按下【i,I,o,O,a,A,r,R】等字母之后才会进入编辑模式。
按下上述的字母时,在画面的左下方会出现【--INSERT--或--插入--】的字样,才可以做文字数据输入。
(3)指令列模式:
在命令模式当中,输入【:
】或【/】就可以将光标移动到最底下那一行,进入指令列模式。
在这个模式当中,可以存盘、结束vi、显示行号等操作。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
Free显示系统中已用空闲内存数量
Rm:
删除文件或目录
三、实验小结、建议及体会
Linux对比Windows有些不同需要时间去适应。
通过这次实验对Linux操作系统有了进一步的了解。
初步掌握了一些Linux系统常用的命令。
通过这仅一个周时间的学习,我们只是了解了linux的一些最基本知识,我会在后的学习中不断完善和加以扩充linux知识的学习。
Linux下C编程
软件SY1001
Linux下的C编程
要求:
掌握vi编辑器的使用方法;
掌握Linux下C程序的源程序编辑方法;
编译、连接和运行方法。
内容:
设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。
1.掌握vi编辑器的使用方法;
2.掌握gcc的使用格式
#include<
iostream>
usingnamespacestd;
intmain()
{
intbegin,end;
inttemp=0;
cout<
<
"
Pleaseentertwonumber:
endl;
cin>
begin>
end;
if(begin>
end)
{
temp=begin;
begin=end;
end=temp;
}
for(inti=begin;
i<
=end;
i++)
cout<
i<
"
;
return0;
}
G++编译
(1).先用viJamesJi.c建立文件
(2).在vi的插入界面输入
#include<
stdio.h>
intmain(void)
{printf("
JamesJi.gcc!
\r\n"
);
(3).编译生成JamesJi文件:
gcc-oJamesJiJamesJi.c
(4).运行JamesJi文件:
./JamesJi
二、实验小结、建议及体会
通过这次实验vi编辑器有了进一步的应用,同时学会了在Linux进行简单的C语言编程,掌握Linux下C程序的源程序编辑方法;
在以后的学习中会加大努力加强自己的编程能力。
加深了对linux的印象,linux的兼容性很强。
C/C++仍旧可以在上面编译成功。
SHELL编程和后台批处理
三、实验内容描述(问题域描述)
掌握Linux系统的SHELL编程方法和后台批处理方法。
(1)将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。
(2)将上面SHELLL程序后台运行。
观察原C程序运行时输入输出情况。
(3)修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容,然后输出到屏幕。
四、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
test.cpp文件如下:
inti,j;
inta[10][10]={0};
a[0][0]=1;
for(i=1;
=9;
for(j=0;
j<
=i;
j++)
{
if((j==0)||(i==j))
a[i][j]=1;
else
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=0;
cout<
a[i][j];
test.sh文件如下
#!
/bin/bash
#Program:
#Thisprogramisusedtocompileandrunafileofcpp
#History
#2011/06/01
g++-otest.outtest.cpp
chmodu+xtest.out
./test.out
Ubuntu操作系统
四、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
调试过程中未发现任何问题
五、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
六、实验小结、建议及体会
通过这次实验熟悉了shell编程,对Linux下的编程有了进一步的了解。
也对Linux系统终端方式使用的编辑器vi有进一步的认识,如何使用命令来打开文件以及在编辑器vi里面编写内容等,。
总之,通过这次实验,对课本上的知识有了进一步的理解以及巩固。
Linux系统调用(time)
学习Linux内核的系统调用,理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。
阅读Linux内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程。
Linux系统调用使用方法。
掌握Linux系统调用使用方法。
学习使用time,ctime,sleep,exit等Linux系统调用使用方法。
unistd.h>
time.h>
while
(1)
chartimebuf[100];
time_tt;
time(&
t);
strftime(timebuf,sizeof(timebuf),"
%Y年%m月%d日%H:
%M:
%S"
localtime(&
t));
timebuf<
fflush(stdout);
sleep
(1);
在现有的系统中添加一个不用传递参数的系统调用。
这个系统调用的功能是实现遍历进程。
实验主要内容:
添加系统调用的名字
利用标准C库进行包装
添加系统调用号
在系统调用表中添加相应表项
sys_mysyscall的实现
G++编译器
【1】下载并部署内核源代码
此步已经在实验2中完成。
【2】添加系统调用号
系统调用号在文件unistd.h里面定义。
这个文件在ubuntu10.10下位于/usr/include/asm/unistd_32.h。
现在我们在unistd.h中添加我们的系统调用号:
__NR_mysyscall,如下所示:
231#define__NR_mysyscall
223
/*添加或修改为mysyscall*/
/*注意:
不同版本的内核系统调用号不一样,您可以根据内核版本不同对系统调用号进行修改*/
添加系统调用号之后,系统才能根据这个号,作为索引,去找syscall_table中的相应表项。
【3】在系统调用表中添加或修改相应表项
我们知道,系统调用处理程序(system_call)会根据eax中的索引到系统调用表(sys_call_table)中寻找相应的表项。
所以,我们必须在那里添加我们自己的一个值。
在2.6.36的内核下,只需要修改arch/x86/kernel/syscall_table_32.S。
注意,修改该文件首先要切换到root权限,此外使用gedit打开该文件时注意它的扩展名是大写的S。
……
233
.longsys_mysyscall
/*在对应的位置修改或添加*/
234
.longsys_gettid
235
.longsys_readahead
/*225*/
……
到现在为止,系统已经能够正确地找到并且调用sys_mysyscall。
剩下的就只有一件事情,那就是sys_mysyscall的实现。
【4】sys_mysyscall的实现
我们把一小段程序添加在kernel/sys.c里面。
在这里,我们并没有在kernel目录下另外添加自己的一个文件,这样做的目的是为了简单,而且不用修改makefile,省去不必要的麻烦。
mysyscall系统调用实现遍历系统中的所有的进程,并打印每个进程的进程名字,进程标识符,进程的状态和父进程的标识符。
进程名字、pid、进程状态、父进程的指针在task-struct结构的字段中。
在内核中使用printk函数打印有关变量的值。
遍历进程可以使用next_task宏,init_task进程为0号进程。
asmlinkageintsys_mysyscall(void)
//在此处加入遍历进程的代码;
【5】重新编译内核
一定要重新编译内核。
内核编译完成后,重新启动编译后的新内核。
【6】编写用户态程序
要测试新添加的系统调用,需要编写一个用户态测试程序(test.c)调用mysyscall系统调用。
mysyscall系统调用中printk函数输出的信息在/var/log/message文件中。
也可以在shell下用dmesg命令查看。
用户态测试程序可以用如下方法实现
linux/unistd.h>
#include<
sys/syscall.h>
#define__NR_mysyscall223
syscall(__NR_mysyscall);
/*或syscall(223)
*/
//在此加入在屏幕输出每个进程相关信息的代码;
用gcc编译源程序
#gcc–otesttest.c
运行程序
#./test
用shell命令查看遍历进程输出的信息
#dmesg
这次实验有点难度,但是通过查找资料和与老师的交流之后还是顺利完成了实验,希望以后相关能力能够得到加强。
Linux进程控制(fork)
Linux系统进程控制
掌握Linux系统中进程控制原语fork的使用方法。
设计C程序,其中主进程创建一个子进程,以特定次序各自执行规定操作后退出。
stdlib.h>
Parentprocessid:
getpid()<
pid_tiRet=fork();
if(iRet<
0)
Createchildprocessfail!
elseif(iRet==0)
I'
mchildprocess,andidis"
ppidis:
getppid()<
else
Createchildprocesssuccesschild"
theidis:
iRet<
(1)
【进程的创建】
编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a”;
子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因。
【源程序】:
intp1,p2;
while((p1=fork())==-1);
if(p1==0)//第一子进程
putchar('
b'
else{
while((p2=fork())==-1);
if(p2==0)
c'
//第二子进程
a'
//父进程
运行多次:
主要输出有bca,偶尔输出cab和cba,abc,bac,acb…
会有如此多种不同输出,主要是因为fork()生成的子进程和父进程是并行运行的,所以先运行哪个进程是由系统的调度算法决定的,ubuntu9.04很大概率系统会先输出bca是因为ubuntu9.04在fork()运行之后很大概率先运行子进程,再运行父进程。
当然也有可能先运行父进程后子进程,再加上进程间的并发性;
导致了输出的多样性。
输出次序带有随机性。
。
(2)
【进程的控制】
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句
话,在观察程序执行时屏幕上出现的现象,并分析原因。
【源代码】:
intmain(){
if(p1==0);
第一个子进程
printf("
Child1isrunning!
\n"
if(p2==0);
第二子进程
Child2isrunning!
else;
父进程
Fatherisrunning!
运行多次,大部分运行后输出:
少数输出:
理论上是有6种不同的结果,还是由于系统的调度算法,程序的并发性影响;
但由于函数printf()在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。
所以与打印单字符的结果相同。
创建进程,使用exec函数族使子进程执行新的目标程序,观察并分析
出现的现象。
===systemcallexecltesting===\n"
execlp("
date"
"
0);
execerror!
输出:
===systemcallexecltesting===
2009年12月04日星期五21:
35:
18CST
输出结果分析:
execlp是一种exec函数,当进程调用一种exec函数时,用指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 finalEDI 汇总
![提示](https://static.bingdoc.com/images/bang_tan.gif)