版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学生学号0121010680225实验课成绩武汉理工大学实验课程名称开课学院指导老师姓名学生姓名学生专业班级实验课程名称开课学院指导老师姓名学生姓名学生专业班级实验课程名称开课学院指导老师姓名学生姓名学生专业班级学生实验报告书实验课程名称开课学院指导老师姓名学生姓名学生专业班级操作系统计算机科学与技术学院刘军姬琪软件工程SY10012012—2013学年第一学期实验项目名称Linux系统调用(time)实验成绩实验者姬琪专业班级软件SY1001Z且另IJ同组者实验日期年月日第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)学习Linux内核的系统调用,理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。阅读Linux内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程。Linux系统调用使用方法。要求:掌握Linux系统调用使用方法。内容:学习使用time,ctime,sleep,exit等Linux系统调用使用方法。二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)#include<stdio.h>#include<unistd.h>#include<time.h>#include<iostream>usingnamespacestd;intmain()(while(l)(chartimebuf[100j;time11;time(&t);strftime(timebuf,sizeof(timebuf),H%Y年%m月%d日%H:%M:%SMocaltime(&t));cout«timebuf«endl;fflush(stdout);sleep(l);)return0;)在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现遍历进程。实验主要内容:添加系统调用的名字利用标准C库进行包装添加系统调用号在系统调用表中添加相应表项sys_mysyscall的实现三、主要仪器设备及耗材Ubuntu操作系统Vi编辑器G++编译器第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)[1]下载并部署内核源代码此步已经在实验2中完成。[2]添加系统调用号系统调用号在文件unistd.h里面定义。这个文件在ubuntulO.10下位于/usr/include/asni/imistd_32.h。现在我们在unistd.h中添加我们的系统调用号:_NRmysyscalL如下所示:231ttdefine_NR_mysyscall223/*添加或修改为mysyscall*//*注意:不同版本的内核系统调用号不一样,您可以根据内核版本不同对系统调用号进行修改*/添加系统调用号之后,系统才能根据这个号,作为索引,去找syscall_table中的相应表项。[3]在系统调用表中添加或修改相应表项我们知道,系统调用处理程序(system_call)会根据eax中的索引到系统调用表(sys_call_table)中寻找相应的表项。所以,我们必须在那里添加我们自己的一个值。在2.6.36的内核下,只需要修改arch/x86/kernel/syscal1table32.So注意,修改该文件首先要切换到root权
限,此外使用gedit打开该文件时注意它的扩展名是大写的So233233234235sys_readahead限,此外使用gedit打开该文件时注意它的扩展名是大写的So233234233234235sys_readahead233234235sys_readahead233234235sys_readahead・longsys_mysyscall.longsys_gettid233234235sys_readahead・longsys_mysyscall.longsys_gettid.long到现在为止,系统已经能够正确地找到并且调用sys_mysyscallo剩下的就只有一件事情,那就是sysjnysyscall的实现。【4】sys_mysyscall的实现我们把一小段程序添加在kernel/sys.c里面。在这里,我们并没有在kernel目录下另外添加自己的一个文件,这样做的目的是为了简单,而且不用修改makefile,省去不必要的麻烦。mysyscall系统调用实现遍历系统中的所有的进程,并打印每个进程的进程名字,进程标识符,进程的状态和父进程的标识符。进程名字、pid、进程状态、父进程的指针在task-struct结构的字段中。在内核中使用printk函数打印有关变量的值。遍历进程可以使用next_task宏,init_task进程为0号进程。asmlinkageintsys_mysyscall(void)(〃在此处加入遍历进程的代码;return0;}[5]重新编译内核一定要重新编译内核。内核编译完成后,重新启动编译后的新内核。[6]编写用户态程序要测试新添加的系统调用,需要编写一个用户态测试程序(test.c)调用mysyscall系统调用。mysyscall系统调用中printk函数输出的信息在/var/log/message文件中。也可以在shell下用dmesg命令查看。用户态测试程序可以用如下方法实现ttinclude<linux/unistd.h>#include<sys/syscall.h>^define_NR_mysyscall223intmain()(syscall(_NR_mysyscall);/*或syscall(223)*/〃在此加入在屏幕输出每个进程相关信息的代码;}用gcc编译源程序gcc-otesttest.c运行程序・/test用shell命令查看遍历进程输出的信息
ttdmesg二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等).longsys_getdents64/♦220♦/.longsys_fcntl64.longsysnisyscall/♦reservedforTUX♦/.longsysjnysyscall.longsysgettid.longsysreadahead/♦225♦/.longsyssetxattr.longsyslsetxattr—sys.c〃添加一个系统调用asmlinkageintsysmysyscall(void){-structtaskstruct*task=&init_task;do(k-printk(,,%s\t%d\t%ld\t%d\n",task->commrtask->pid,>state,task->parent->pid);}while((task=nexttask(task))!=&init_task);return0;k-)|三、实验小结、建议及体会这次实验有点难度,但是通过查找资料和与老师的交流之后还是顺利完成了实验,希望以后相关能力能够得到加强。实验项目名称Linux进程控制(fork)实验成绩实验者姬琪专业班级软件SY1001组别同组者实验日期年月曰第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)Linux系统进程控制要求:掌握Linux系统中进程控制原语fork的使用方法。内容:设计C程序,其中主进程创建一个子进程,以特定次序各自执行规定操作后退出。二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)#include<stdlib.h>#include<unistd.h>#include<iostream>usingnamespacestd;intmain()(cout«HParentprocessid:n«getpid()«endl;pid_tiRet=fork();if(iRet<0)cout«HCreatechildprocessfail!n«endl;elseif(iRet==0)(cout«nrmchildprocess,andidisn«getpid()«nppidis:H«getppid()«endl;)else(cout«HCreatechildprocesssuccesschildn«ntheidis:n«iRet«endl;)return0;)三、主要仪器设备及耗材Ubuntu操作体统Vi编辑器G++编译第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)(1)【进程的创建】编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a”;子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因。【源程序】:#include<stdio.h>intmain(){intpl,p2;while((pl二fork())二二-1);if(pl=0)〃第一子进程putchar('b');else{while((p2=fork())==-1);if(p2二二0)putchar(?c);〃第二子进程elseputchar('a');//父进程)return0;运行多次:主要输出有bca,偶尔输出cab和cba,abc,bac,acb…会有如此多种不同输出,主要是因为fork。生成的子进程和父进程是并行运行的,所以先运行哪个进程是由系统的调度算法决定的,ubuntu9.04很大概率系统会先输出bca是因为ubuntu9.04在fork()运行之后很大概率先运行子进程,再运行父进程。当然也有可能先运行父进程后子进程,再加上进程间的并发性;导致了输出的多样性。输出次序带有随机性。(2)【进程的控制】修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。【源代码】:#include<stdio.h>intmain(){intpl,p2;while((pl二forkO)二二-1);if(pl==0);第一个子进程printf("Childlisrunning!\n,/);else{while((p2=forkO)==-1);if(P2=0);第二子进程printf(Z/Child2isrunning!\nz/);else;父进程printf("Fatherisrunning!\n/z);}return0;运行多次,大部分运行后输出:Childlisrunning!Child2isrunning!Fatherisrunning!少数输出:Child2isrunning!Childlisrunning!Fatherisrunning!Fatherisrunning!Childlisrunning!Child2isrunning!理论上是有6种不同的结果,还是由于系统的调度算法,程序的并发性影响;但由于函数printf()在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。所以与打印单字符的结果相同。创建进程,使用exec函数族使子进程执行新的目标程序,观察并分析出现的现象。【源代码】:ttinclude<stdio.h>ttinclude<unistd.h>intmain()(printf(zz===systemcallexecltesting二二二\n〃);execlp(〃date〃,〃date〃,0);printf(z,execerror!\n〃);return0;}输出:二二二systemcallexecltesting二二二2009年12月04H星期五21:35:18CST输出结果分析:execlp是一种exec函数,当进程调用一种exec函数时,用指定的目标进程更好进程的执行映像。Exec调用成功后,调用进程的正文段被指定的文件的正文段所覆盖。调用成功时,exec不返回,从而不执行exec以后的所有语句,所以本例就只有输出“2009年12月04日星期五21:35:18CST"的情况。如果调用失败,返回T,执行剩余指令。(3)【进程信号处理】编写程序使用系统调用fork。创建两个子进程,再用系统调用singal()让父进程捕捉键盘上来的中断信号(即按Ctrl+c键);当捕捉到中断信号后,父进程用系统调用KillO向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!父进程等待两个子进程终止后,输出如下的信息后终止:ParentProcessisKilled!【源代码工#include<stdio.h>#include<signal.h>intwait_mark;voidwaiting()(while(wait_mark=1);voidstop()(wait_mark=0;intmain()(intpl,p2;while((pl=fork())==-1);if(pl==0);第一个子进程(waitmark=1;signal(SIGINT,SIG_IGN);signal(16,stop);waiting();lockf(l,1,0);;加锁printf(''ChildProcessllisKilledbyParent!\n,z);lockf(l,0,0);;解锁exit(0);)Else(while((p2=forkO)==-1);if(P2=0);第二个子进程(waitmark=1;
signal(SIGINT,SIG_IGN);signal(17,stop);waiting();lockf(l,1,0);;加锁printf("ChildProcessl2isKilledbyParent!\n,z);lockf(l,0,0);;解锁exit(0);)Else;父进程(waitmark=1;signal(SIGINT,stop);waiting();kill(pl,16);kill(p2,17);wait(0);wait(0);printf(z,ParentProcessisKilled!\n,z);exit(0);输出结果有两种:ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!ParentprocessisKilled!by
byParent!Parent!by
byParent!Parent!二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)horizon@horizon-desktop:〜文件(E)编辑(E)查看(Y)终端(工)帮助但)horizon(3horizon-desktop:*$g++TestFork.cpphorizon(ahorizon-desktop:*$./a.outParentprocessid:2641Createchildprocesssuccesschildtheidis:2642I'mchildprocess,andidis2642ppidis:2641horizon(ahorizon-desktop|三、实验小结、建议及体会通过这次实验掌握Linux系统中进程控制原语fork的使用方法。同时发现自己对Linux有很多的不熟悉的地方,在以后会进一步加强。实验项目名称Linux键盘命令和vi实验成绩实验者姬琪专业班级软件工程SY1OO1组另IJ同组者实验日期年月日第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)Linux键盘命令和viL要求:掌握Linux系统键盘命令的使用方法.使用mkdir命令建立一个子目录subdir.使用cat或more命令查看filei文件的内容。.将date命令的用法附加到文件filel的后面:.利用Is-1filel命令列出文件filel的较详细的信息。.利用rmfa命令将文件fa删除。再利用Is-1命令查看工作目录内容。.运行nivfilelfile_a命令,然后用Is命令查看这两个文件是否都还在工作目录中2.vi操作L了解vi编辑器的作用和功能.熟悉vi的操作环境和切换方法.掌握vi操作的方式(几个常用键)4,了解常用的快捷键二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)VI编辑器的常见命令:vifilename:打开或新建文件,并将光标置于第一行首vi+nfilename:打开文件,并将光标置于第n行首vi+filename:打开文件,并将光标置于最后一行首vi+/patternfilename:打开文件,并将光标置于第一个与pattern匹配的串处vi-rfilename:在上次正用vi编辑时发生系统崩溃,恢复filenamevifilename....filename:打开多个文件,依次进行编辑键盘命令:cat,more,less命令Is命令cp命令rm命令mv命令VI命令:.vi进入vi缓冲区.vifilel:进入文件filel3.退出vi三、主要仪器设备及耗材Ubuntu操作体统Vi编辑器第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)1使用mkdir命令建立一个子目录subdir$mkdirsubdir$2使用cat或more命令查看filei文件的内容。$catfilelSatMar1721:25:14CST2012$3将date命令的用法附加到文件filel的后面:mandate>>filel$mandate>>filel$4利用Is-1filel命令列出文件filel的较详细的信息。$Is-1filel-rw-rw-r-1ml2010ml20105690Mar1721:28filel$5利用rmfa命令将文件fa删除。再利用IsT命令查看工作目录内容。$rmfa$Is-1total12-rw-rw-r—1ml2010m120105690Mar1721:28filel$6运行mvfilelfile_a命令,然后用Is命令查看这两个文件是否都还在工作目录中?[ml2010@tansubdir]$mvfilelfile_a[ml2010@tansubdir]$Isfilea[ml2010@tansubdir]$显然,只有file_a在工作目录中,而filel不在工作目录中vi共分为三种模式(1)命令模式:命令模式为Vi的初始模式,可以使用“上下左右”按键来移动光标,您可以使用“删除字符”或“删除整行”来处理文档。在编辑模式或指令列模式中按【ESC】键可换回命令模式。(2)编辑模式:在命令模式中按下【i,L。,0,a,A,r,R]等字母之后才会进入编辑模式。按下上述的字母时,在画面的左下方会出现【一INSERT一或一插入一】的字样,才可以做文字数据输入。(3)指令列模式:在命令模式当中,输入【:】或【/】就可以将光标移动到最底下那一行,进入指令列模式。在这个模式当中,可以存盘、结束vi、显示行号等操作。二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)Free显示系统中已用空闲内存数量horizon@horizon-desktop:~文件(E)编辑(E)查看(V)终端(工)帮助出)horizon(ahorizon-desktop:*$freehorizon(ahorizon-desktop:*$totalusedtotalusedMem:509232443900-/+buffers/cache:191672SwapotalusedMem:509232443900-/+buffers/cache:191672Swapree65332totalusedMem:509232443900-/+buffers/cache:191672Swapree653323175601336460sharedbuffers013984cached238244Rm:删除文件或目录orizon@horizon-desktop文件(E)编辑(E)查看(V)终端(工)帮助出)horizon(ahorizon-desktop:*$rmfilerm:无法删除"file":没有该文件或目录horizon(ahorizon-desktop:*$rmDesFilehorizon(ahorizon-desktop:-$|三、实验小结、建议及体会Linux对比Windows有些不同需要口寸间去适应。通过这次实验对Linux操作系统有了进一步的了解。初步掌握了一些Linux系统常用的命令。通过这仅一个周时间的学习,我们只是了解了linux的一些最基本知识,我会在后的学习中不断完善和加以扩充linux知识的学习。实验项目名称Linux下C编程实验成绩实验者姬琪专业班级软件SY1001组别同组者实验日期年月曰第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)Linux下的C编程要求:掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。内容:设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。.掌握vi编辑器的使用方法;.掌握gcc的使用格式二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)#include<iostream>usingnamespacestd;intmain(){intbegin,end;inttemp=0;cout«nPleaseentertwonumber:n«endl;cin»begin»end;if(begin>end)(temp=begin;begin二end;end=temp;)for(inti=begin;i<=end;i++)(cout«i«HH;)cout«endl;return0;三、主要仪器设备及耗材Ubuntu操作体统Vi编辑器G++编译第二部分:实验调试与结果分析(可加页)一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等).先用viJamesJi.c建立文件.在vi的插入界面输入^include<stdio.h>intmain(void){printf("JamesJi.gcc!\r\n〃);return0;}.编译生成JamesJi文件:gcc-oJamesJiJamesJi.c.运行JamesJi文件:./JamesJi二、实验小结、建议及体会通过这次实验Vi编辑器有了进一步的应用,同时学会了在Linux进行简单的C语言编程,掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。在以后的学习中会加大努力加强自己的编程能力。加深了对linux的印象,linux的兼容性很强。C/C++仍旧可以在上面编译成功。实验项目名称SHELL编程和后台批处理实验成绩实验者姬琪专业班级软件SY1001组别同组者实验日期年月曰第一部分:实验分析与设计(可加页)三、实验内容描述(问题域描述)SHELL编程和后台批处理要求:掌握Linux系统的SHELL编程方法和后台批处理方法。内容:(1)将编译、连接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年重庆医药高等专科学校附属第一医院招聘真题
- PDCA循环阶段在“5领导作用”条款中的应用指南(雷泽佳编制-2026B0)
- 2025年重庆电力高等专科学校招聘事业单位工作人员真题
- 2025年湖南女子学院招聘真题
- 2025年陕西西安工业大学专职辅导员招聘考试真题
- 事业单位结构化面试题库及答案
- 教师应急能力不足个人整改措施
- 教师培训经验需求方案
- 基层干部在安全生产工作中履职不到位检讨书
- 螺栓表面预处理应用产线项目环评报告表
- 2026年中级注册安全工程师《其他安全实务》能力检测及参考答案详解(模拟题)
- 叉车充电安全须知培训课件
- 医院投诉处理流程标准化手册
- 2025-2026学年黑龙江省齐齐哈尔市建华区八年级(上)期末英语试卷(含答案)
- 2026年护理安全警示教育与质量提升实践
- 兽药GMP基本知识培训
- 特色小镇文化旅游产业开发项目2025年文化创意产业融合与技术创新可行性分析报告
- DLWD-CSMK故障考核模块技术方案
- (行业)常用表面处理工艺详解(行业讲座教学培训课件)
- 星际航行概论钱学森著2008
- 高血压性心脏病护理
评论
0/150
提交评论