Linux操作系统设计实践报告一_第1页
Linux操作系统设计实践报告一_第2页
Linux操作系统设计实践报告一_第3页
Linux操作系统设计实践报告一_第4页
Linux操作系统设计实践报告一_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

《Linux操作系统设计实践》实验报告一学号:000000000姓名:***(组长)学院:数计学院专业:年级:09本组其它成员:学号姓名学号姓名学号姓名实验时间:2011-2012学年第一学期指导教师:《Linux操作系统设计实践》实验一:进程管理实验目的:加深对进程概念的理解,明确进程和程序的区别。进一步认识并发执行的实质。学习通过进程执行新的目标程序的方法。了解Linux系统中进程信号处理的基本原理。实验环境:RedHatEnterpriseLinux5实验内容:实验一进程管理(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”:子进程分别显示“b”和“c”。试观察记录屏幕上显示结果,并分析原因。#include<stdio.h>intmain(){intp1,p2;while((p1=fork())==-1);if(p1==0)putchar('b');else{while((p2=fork())==-1);if(p2==0)putchar('c');elseputchar('a');}return0;}显示结果:分析总共可能的结果有:1.子进程全部创建成功:bcabaccabcbaacbabc2.子进程一创建失败:b3.子进程二创建失败:bccb我的虚拟机上实验结果显示:bca分析原因:首先,根据fock()函数原理,fock()对于该语句之前的程序段只执行一次。此外,fock()对于该语句返回两次值,并针对两次返回值依次执行之后的语句,一般来说fock()是先进入子程序执行代码,再执行父进程代码。父进程与子进程的执行是相互独立的,相互之间没有任何时序上的关系。完全由操作系统的调度程序来决定进城的执行次序、速度。所以在没有加入进程同步机制(比如信号,信号量等)的代码的情况下,打印结果是随机出现的。在本程序中,对于子进程p1,p2和父进程,我使用的计算机操作系统令p1==0时,打印“b”,再让p2==0,打印“c”,最后打印“a”,结果显示为:bca由于在单机系统下很难出现因系统资源不足导致的进程创建失败,所以后三种情况很难调试出来,但是根据fock()的实现原理,理论上是完全可能出现的。(2)进程的控制1.修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行是屏幕上出现的现象,并分析其原因。#include<stdio.h>intmain(){intp1,p2;while((p1=fork())==-1);if(p1==0)printf("Child1isrunning!\n");else{while((p2=fork())==-1);if(p2==0)printf("Child2isrunning!\n");elseprintf("Fatherisrunning!\n");}return0;}显示结果:本程序是在第一题的源程序基础上直接编程字符串输出,与第一题相似,故输出结果和第一个实验现象一样,预测结果也有9种,这里就不一一例举了。我的虚拟机上实验结果显示为:Child1isrunning!Child2isrunning!Fatherisrunning!分析原因:本题的原理与第一小题相同,在本程序中,对于子进程p1,p2和父进程,我使用的计算机操作系统令p1==0时,打印:“Child1isrunning!”,再让p2==0,打印“Child2isrunning!”,最后打印“Fatherisrunning!”。2.使用exec函数族使子进程执行新的目标程序。#include<stdio.h>#include<unistd.h>intmain(){ printf("===systemcallexecltesting===\n"); execlp("date","date",0); printf("execerror!\n"); return0;}显示结果:我的虚拟机上实验结果显示为:===systemcallexecltesting===2011年10月29日星期六分析原因:exec函数使子进程执行新的目标程序。如果调用成功则执行另一个进程,与fock()最大的区别是一旦exec调用成功,就不执行原来进程后面的代码。即不会输出“execerror!”(3.)编写一段程序,使其实现进程的软中断通信[1]使用系统调用fork()创建两个子程序,再用系统调用signal()接收父进程从键盘上来的中断信号(即按Ctrl+c键);当有中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程有信号后分别输出ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!父进程等待两个子进程终止后,输出如下的信息后终止:ParentprocessisKilled!============================#include<stdio.h>#include<signal.h>intwait_mark;voidwaiting(){while(wait_mark==1);}voidstop(){wait_mark=0;}intmain(){intp1,p2;while((p1=fork())==-1);if(p1==0){wait_mark=1;signal(SIGINT,SIG_IGN);signal(16,stop);waiting();printf("ChildProcess11isKilledbyParent!\n");exit(0);}else{while((p2=fork())==-1);if(p2==0){wait_mark=1;signal(SIGINT,SIG_IGN);signal(17,stop);waiting();printf("ChildProcess12isKilledbyParent!\n");exit(0);}else{wait_mark=1;signal(SIGINT,stop);waiting();kill(p1,16);kill(p2,17);wait(0);wait(0);printf("ParentProcessisKilled!\n");exit(0);}}}结果显示:我的虚拟机上实验结果显示:ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!ParentProcessisKilled!分析原因:首先对wait函数进行分析,进程一旦调用了wai,就立即阻塞

温馨提示

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

评论

0/150

提交评论