实验二进程管理_第1页
实验二进程管理_第2页
实验二进程管理_第3页
实验二进程管理_第4页
实验二进程管理_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

实验二

进程管理(一)实验的或实验理.加深对进概念的理,明确进和程序的区别。.进一步认并发执行实质。.分析进程争资源现,学习解进程互斥的方法。.了解inux系统进程通信基本原理。(二)实验容.进程的创。.进程的控。.①编写一程序,使现实进程软中断通信。要求:使用统调用fork()建两个进程,再系统调用ignal()让父进捕捉键盘上来的中断信按EL键当捕到中断信号后,父进程用系统调用Kill()两个进程发出信号,子进程捕捉信号后分输出下列息后终止:ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!父进程等待个子进程止后,输如下的信息后终止ParentProcessisKilled!②在上面的序中增加句signal(SIGNAL,SIG-IGN)和ignal(SIGQUIT,SIG-IGN),观察执行结果,分析原因4.进程的管通信。编制一段程,实现进的管理通。使用系统调pipe()建立一条道线;两个子进程1和2分别管道中写一话:Child1issendingamessage!Child2issendingamessage!而父进程则管道中读来自于两子进程的信息,显示在屏幕上。要求父进程接收子进P发来的息,然后再接收子进程P2发来的息。实验2指导[验内容1.进程的创建〈任务〉编写一段程,使用系调用fork()创两个子进。当此程运行时,在系统中有一个父进程和两个子程活动。每一个进在屏幕上显示一个字符;父进程显字符“a”,子进程分别显示字符“b和“c”试观记录屏幕上显示结果并分析原。〈程序〉#include<>main(){intp1,p2;if(p1=fork())/*进程创建功*/putchar('b');else{if(p2=fork())/*子程创建成功*putchar('c');elseputchar('a');/*父程执行*/}}<运行结果bca(时会出abc的任的排列分析:从进执行并发看,输出的排列是有可的。原因:创建进程需的时间虽可能多于出一个字的时间,各个进程的时间片的获得却不是一定顺序的,以输出abc的排列都是可能的。2.进程的控制<任务>修改已编写的程序,每个程序输出由单个字符改为一句话,再观程序执行屏幕上出的现象,并析其原因如果在程中使用系统调用lockf()来给每个程加锁,可以实现进程之间的互斥,观并分析出的现象。〈程序1#include<>main(){intp1,p2,i;if(p1=fork()){for(i=0;i<500;i++)printf("parent%d\n",i);wait(0);/*保证在子进终止前,父程不会终*/exit(0);}else{if(p2=fork()){for(i=0;i<500;i++)printf("son%d\n",i);wait(0);/*保证在子进终止前,父程不会终*/exit(0);/*向父进程信号且进程退出*/}else{for(i=0;i<500;i++)printf(“grandchild%d\n",i);exit(0);}}}〈运行结果parent….son…grandchild…grandchild…或grandchild…son…grandchild…son…parent分析:由于数出的字符之间不会中断,因,每个字符内部的字顺序输出时不变。是由于进并发执行的调度顺序和父子进程的抢占处理问题,输字符串的序和先后随执行的不而发生变。这与打印单字符的结果相同。〈程序2#include<>#include<>main(){intp1,p2,i;if(p1=fork()){lockf(1,1,0);for(i=0;i<500;i++)printf("parent%d\n",i);lockf(1,0,0);wait(0);/*保在子进程终止前,父进不会终止*/exit(0);}else{if(p2=fork()){lockf(1,1,0);for(i=0;i<500;i++)printf("son%d\n",i);lockf(1,0,0);wait(0);/*保证在子进终止前,父程不会终*/exit(0);}else{lockf(1,1,0);for(i=0;i<500;i++)printf("daughter%d\n",i);lockf(1,0,0);exit(0);}}}<运行结果〉输出parent块son块grandchild的顺可能不同,但是每个块的输出过程会被打断分析:因为述程序执时,lockf(1,1,0)锁定标准输设备,lockf(1,0,0)解锁准输出设备,在lockf(1,1,0)与lockf(1,0,0)中间的for循环输出不被中断,锁与不加锁效果不相同。3.软中断通信〈任务1编制一段程,使用系调用fork()创建两个子进程,再用系统调用signal()让父进程捕键盘上来的中信号(即ctrl+c键),当捕到中断信后,父进用系统调用kill()向个子进程发出信号子进程捕到信号后分别输出下列信息后终止:childkilledbyparent!childkilledbyparent!父进程等待个子进程止后,输以下信息后终止:parentprocessiskilled!<程序流程图>〈程序〉#include<>#include<>#include<>voidwaiting(),stop(),alarming();intwait_mark;main(){intp1,p2;if(p1=fork())/*创建进程p1*/{if(p2=fork()){

/*创建进程wait_mark=1;signal(SIGINT,stop);/*接收到c信,转stop*/接受SIGALRM*/waiting();kill(p1,16);/*向p1软中信号kill(p2,17);/*向发中断信号wait(0);/*同步/wait(0);printf("parentprocessiskilled!\n");exit(0);}else{wait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN);/*忽略^c信号/while(wait_mark!=0);lockf(1,1,0);printf("childprocess2iskilledbyparent!\n");lockf(1,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN);/*忽略^信号/while(wait_mark!=0)lockf(1,1,0);printf("childprocess1killedparent!\n");lockf(1,0,0);exit(0);}}voidwaiting(){sleep(5);if(wait_mark!=0)kill(getpid(),SIGALRM);}voidalarming(){wait_mark=0;}voidstop(){wait_mark=0;}<运行结果不做任何操等待五秒父进程回子进程县推出后退出,并打印退出顺序;或点击ctrl+C后程序退出打印退出顺序。〈任务2在上面的任1中增加语句signal(SIGINT,SIG_IGN)和句signal(SIGQUIT,SIG_IGN),观察执行结果,分析原因这里,signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽键信号以及忽中断信号<程序>#include<>#include<>#include<>intpid1,pid2;intEndFlag=0;intpf1=0;intpf2=0;voidIntDelete(){kill(pid1,16);kill(pid2,17);}voidInt1(){printf("childprocesskilled!byparent\n");exit(0);}voidInt2(){printf("childprocesskilled!byparent\n");exit(0);}main(){intexitpid;if(pid1=fork()){if(pid2=fork()){signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);waitpid(-1,&exitpid,0);printf("parentprocessiskilled\n");exit(0);}else{signal(SIGINT,SIG_IGN);signal(17,Int2);pause();}}else{signal(SIGINT,SIG_IGN);signal(16,Int1);pause();}}〈运行结果请将上述程输入计算后,执行观察。3.进程的管道信〈任务〉编制一段程,实现进的管道通。使用系统调用pipe()建立一条管线。两个进程p1和p2分别向通道写一句话child1processissendingmessage!child2processissendingmessage!而父进程则管道中读来自两个程的信息,显示在屏幕上。〈程序〉#include<>#include<>#include<>intpid1,pid2;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);}else{while((pid2=fork(if(pid2==0){lockf(fd[1],1,0);/*斥*/sprintf(outpipe,"child2processissendingmessage!");write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{wait(0);/*同步/read(fd[0],inpipe,50);/*管道

温馨提示

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

评论

0/150

提交评论