linux操作系统实验报告.doc_第1页
linux操作系统实验报告.doc_第2页
linux操作系统实验报告.doc_第3页
linux操作系统实验报告.doc_第4页
linux操作系统实验报告.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、 设计题目进程管理及理解和增加Linux系统调用二、 设计时间和地点设计时间:2011年12月26日2011年12月29日设计地点:装备制造学院B座502机房三、 设计目的和要求(1)加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。(3)分析进程争用资源的现象,学习解决互斥的方法。(4)了解Linux系统中进程通信的基本原理。(5)弄清进程管理在操作系统中的地位和作用。(6) 初步揭开Linux内核的神秘“面纱”,为今后深入学习内核原理打下基础。(7)弄清系统调用原理,以及操作系统在处理每个系统调用的时候,用户态怎样切入核心态?又怎样从核心态返回到用户态的?四、设计内容(1)实验准备a. 基本头文件:类型头文件,定义了基本的系统数据类型。:定义了各种符号常数和类型,并声明了各种函数。带缓冲的标准输入输出!头文件即standard library标准库头文件b.vi编辑器的基本使用 rootlocalhost # vi filenameCommand 模式是vi默认模式,如果我们处于其它命令模式时,当我们按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令;:w 保存;:w filename 另存为filename;:wq! 保存退出;:wq! filename 注:以filename为文件名保存后退出;:q! 不保存退出; c.gcc的基本使用1、直接编译gcc filename.c -o filename2、分步编译进行预编译# gcc -E hello.c -o hello.i生成目标代码# gcc -c hello.i -o hello.o链接成可执行文件# gcc hello.o -o hello d.U盘的挂载与卸载先要为外挂点新建一个子目录,一般外挂点的子目录都是建立在/mnt里面的,也建在那里,当然也可以建在/目录下,名字可以自己定,就取名为usb,终端下的命令如下:mkdir /mnt/usb 然后接上U盘了,在终端下输入mount /dev/sdb1 /mnt/usb命令并击Enter删除挂起点,方法是:umount /dev/sdb1 /mnt/usb 或 umount /dev/sdb1(2)设计内容1、进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“A”;子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。a、程序代码:#include#include#include#includemain()if(fork()=0)printf(进程b 该进程的ID号为:%dn,getpid();exit(0);elseif(fork()=0)printf(进程该进程的ID号为:%dn,getpid();exit(0);printf(进程a 该进程的ID号为:%dn,getpid();exit(0);b、程序解释fork()函数:功能:创建一个新进程。格式:int fork()返回值:0:创建子进程,从子进程返回的id值大于0:从父进程返回的了进程id值-1:创建失败getpid()函数:getpid函数用来取得目前进程的进程识别码,许多程序利用取到 的此值来建立临时文件c、结果截图c、结果分析多次运行程序,显示结果不一定唯一。具体显示顺序由调度机制决定。2、进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察 程序执行时屏幕上出现的现象,并分析原因。如果在程序中使用系统调用lockf(),来给每一个进程加锁,可以实现进程之间 的互斥,观察并分析出现的现象。 a、 程序代码#include#include#include #includemain()int p1,p2,i;if(p1=fork()lockf(1,1,0);printf(子进程2已创建!n);exit(0);else if(p2=fork()printf(子进程1已创建!n);exit(0);elseprintf(父进程已经创建!n);exit(0);b、 结果截图c、 结果分析成功显示一段话,其中循序与进程的调度机制有关加入lockf()函数后#include#include#include #includemain()int p1,p2,i;if(p1=fork()lockf(1,1,0);printf(子进程2已创建!n);exit(0);lockf(1,0,0);else if(p2=fork() lockf(1,1,0); printf(子进程1已创建!n);exit(0);lockf(1,0,0);else lockf(1,1,0); printf(父进程已经创建!n);exit(0);lockf(1,0,0);b、程序解释lockf()函数:允许将文件区域用作信号量,或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。当进程终止时,将释放进程保留的所有锁定。c、结果分析显示结果与未加lockf()并无太大区别,只是显示固定3、编制一段程序,使其实现进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号;当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child Process11 is Killed by Parent!Child Process12 is Killed by Parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent Process is Killed!a、 程序框图b、 程序代码:#include#include#include #includevoid waiting(),stop();int wait_mark;main()int p1,p2;if(p1=fork()if(p2=fork() wait_mark=1;signal(SIGINT,stop); waiting();kill(p1,16); kill(p2,17); wait(0); wait(0);printf(parent process is killed!n);exit(0);elsewait_mark=1; signal(SIGINT,stop);waiting();lockf(1,0,0);printf(child process2 is killed by parent!n);lockf(1,0,0);exit(0);elsewait_mark=1;signal(SIGINT,stop);waiting();lockf(1,0,0);printf(child process1 is killed by parent!n);lockf(1,0,0);exit(0);void waiting()while (wait_mark!=0);void stop()wait_mark=0;c、 程序解释: kill(p1,16):用来送参数16(代表用户自定义信号一)指定的信号给参数p1指定的进程 kill(p2,17):用来送参数17(代表用户自定义信号二)指定的信号给参数p2指定的进程signal(SIGINT,stop):捕捉SIGINT信号(ctrl+c会产生该信号),转而执行stop函数d、 结果截图 e、 结果分析: 由于stop函数与waiting函数共同作用。保证了Parent Process is Killed!一定在Child Process11 is Killed by Parent!Child Process12 is Killed by Parent!之后输出。f、 调试问题:由于网上原版的程序代码没有头文件。而exit(0);是包含在该头文件中,所以会出现“隐式声明与内建函数 exit 不兼容”错误。 在上面的程序中增加系统调用signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。a、程序代码:#include#include#include#includeint pid1,pid2;int EndFlag=0;int pf1=0;int pf2=0;void IntDelete()kill(pid1,16);kill(pid2,17);EndFlag=1;void Int1()printf(child process 1 is killed !by parentn);exit(0);void Int2()printf(child process 2 is killed !by parentn);exit(0);main()int exitpid;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN);if(pid1=fork()signal(SIGUSR1,Int1);signal(SIGINT,SIG_IGN);pause();exit(0);elseif(pid2=fork()signal(SIGUSR1,Int1);signal(SIGINT,SIG_IGN);pause();exit(0);elsesignal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);printf(parent process is killedn);exit(0);b、程序解释:signal(SIGINT,SIG_IGN):捕捉中断信号,用SIG_IGN忽略pause():暂停程序,知道signal发出信号c、结果分析:由于忽略了中断与退出信号,程序会一直保持阻塞状态而无法退出4、进程的管道通信编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2分别向管道各写一句话:Child1 is sending a message!Child2 is sending a message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。a、 程序框图b、 程序代码:#include#include#include#includeint pid1,pid2;main()int fd2;char OutPipe100,InPipe100;pipe(fd);while(pid1=fork()=-1);if(pid1=0)lockf(fd1,1,0);sprintf(OutPipe,child 1 process is sending message!); write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork()=-1); if(pid2=0)lockf(fd1,1,0);sprintf(OutPipe,child 2 proeess is sending message!);write(fd1,OutPipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);read(fd0,InPipe,50);printf(%sn,InPipe);wait(0);read(fd0,InPipe,50);printf(%sn,InPipe);exit(0);c、 程序解释:read(fd0,InPipe,50); 参数handle所指的文件传送nbyte个字节到buf指针所指的内存中。write(fd1,OutPipe,50);/fd1文件描述符(写),buffer,50个字节sprintf(OutPipe,child 1 process is sending message!);/将引号内容输入到OutPipe数组中sleep(5):让程序睡眠5秒pipe(fd):通道函数,参数确定读写操作d、 结果截图:e、 结果分析管道两端可分别用描述字fd0以及fd1来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd0表示,称其为管道读端;另一端则只能用于写,由描述字fd1来表示,称其为管道写端。(三)、自学笔记: 程序段中每个进程退出时都用了语句exit(0),为什么?请读者思考。 这是进城的正常终止。在正常终止时exit()函数会返回进程结束状态。异常终止时,则由系统内核产生一个代表异常终止原因的终止状态。该进程的父进程都能用wait()得到其终止状态。在子进程调用exit()后,子进程的结束状态会返回给系统内核,由内核根据状态字生成的终止状态。供父进程在wait()中读取数据,若子进程结束后,父进程还没有读取子进程的终止状态,则系统就子进程的终止状态设置为“ZOMBIE”并保留子进程的控制块信息。父进程读取信息后,系统才彻底释放子进程的控制块。若父进程在子进程结束之前结束的话,则子进程就编程了“孤儿进程”,系统进程init会自动“收养”该子进程,成为该子进程的父进程即父进程标识号变为1,当子进程结束时,init会自动调用wait()读取子进程的遗留数据,从而避免在系统中留下的大量垃圾。信号标识表信号取值默认动作含义(发出信号的原因)SIGHUP1Term终端的挂断或进程死亡SIGINT2Term来自键盘的中断信号SIGQUIT3Core来自键盘的离开信号SIGILL4Core非法指令SIGABRT6Core来自abort的异常信号SIGFPE8Core浮点例外SIGKILL9Term杀死SIGSEGV11Core段非法错误(内存引用无效)SIGPIPE13Term管道损坏:向一个没有读进程的管道写数据SIGALRM14Term来自alarm的计时器到时信号SIGTERM15Term终止SIGUSR130,10,16Term用户自定义信号1SIGUSR231,12,17Term用户自定义信号2SIGCHLD20,17,18Ign子进程停止或终止SIGCONT19,18,25Cont如果停止,继续执行SIGSTOP17,19,23Stop非来自终端的停止信号SIGTSTP18,20,24Stop来自终端的停止信号SIGTTIN21,21,26Stop后台进程读终端SIGTTOU22,22,27Stop后台进程写终端SIGBUS10,7,10Core总线错误(内存访问错误)SIGPOLLTermPollable事件发生(Sys V),与SIGIO同义SIGPROF27,27,29Term统计分布图用计时器到时SIGSYS12,-,12Core非法系统调用(SVr4)SIGTRAP5Core跟踪/断点自陷SIGURG16,23,21Ignsocket紧急信号(4.2BSD)SIGVTALRM26,26,28Term虚拟计时器到时(4.2BSD)SIGXCPU24,24,30Core超

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论