欢迎来到天天文库
浏览记录
ID:28026651
大小:157.95 KB
页数:7页
时间:2018-12-07
《实验七编写多进程程序》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、念易大学类發板去学生姓名:陈圮任学号:6100412040专业班级:网I:121班实验类型.•口验证口综合口设计口创新实验F1期:2015.6.12实验成缋.•一、实验项0名称《编写多进程程序和守护程序》二、实验目的通过编W多进程程序,使读者熟练掌握fork()、exec(),wait()和waitpid()等函数的使用,进一步理解在Linux屮多进程编程的步骤。(守护进程)通过编写-个完整的守护进程,使读者掌握守护进程编写和调试的方法,并且进一步熟悉如何编写多进程程序三、实验内容该实验冇3个进
2、程,艽中一个为父进程,艽余两个是该父进程创建的了进程,K中一个子进程运行“is-r指令,另一个子进程在暂停5s之后界常退!h,父进程先用阻塞方式等待第一个子进程的结朿,然后用非m塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回。(守护进程)在该实验中,读者首先建立起一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并山守护进程收集子进程退出的消怠。在这里,子进程和守护进程的返出消总都在系统R志文件(例如<7var/log/messages
3、,F1志文件的全路径名因版木的不同可能会有所不同)屮输出。子进程退出后,守护进程循环皙停,其M隔时问为10s。!1!、实验步骤(1)W出该实验流程图该实验流程图如图所示。(结束}图实验7.1流程图(2)实验源代码(multi_proc.c)先看一T卜*面的代码,这个程序能得到我们所希望的结來吗,它的运行会产生几个进程?回忆一KforkO调用的其体过程。/*multLproc_wrong.c*/#include#include#includc<$ys/typ
4、cs.h>#include#inckideintmain(void){pid_tchildl,child2,child;/*创边两个子进程childI=foik();child2=fork();/*子进程1的出错处玴*/if(child1==-1){piintf(’’Childlforkerror");cxit(l);}elseif(child1==0)/*在子进秤1屮调用execIpO谈数*/{printf("Inchildl:executeIs
5、-r");if(exedp(”lsM,NULL)<0){printf("ChildlcxcclpcrrorM);}}if(child2==-1>/*子进程2的出错处理*/printf(HChild2forkerrorH);exit(l);}elseif(child2==0)/*在子进程2中使其暂停5s*/{printf("Inchild2:sleepfor5secondsandthencxitH);sleep(5);cxit(O);else/*在父进程屮等待两个子进程的氾出*/{
6、printf("Infatherproccss:H);child=waitpid(childl,NULL,0);/•狙塞式等待*/if(child==child1)printfC’Getchild!exitcode");}elseprintf("Erroroccured!");}dochild=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/if(child==0){printfCThechild?processhasnotexited!");sle
7、ep(l);}}while(child==0);if(child==child2){printf(HGetchild2exitcode°);}elseprintf("Erroroccured!");}}cxit(0);}编译和运行以上代码,并观察其运行结果。它的结果是我们所希望的吗?看完前而的代码之后,再观察下而的代码,它们之间冇什么区别,会解决哪些问题。/々multi一proc.c*/#includc#include^include8、cs.h>#include#includeintmain(void)pid_tchildl,child2,child:/*创述两个子进程*/child1=fork();子进程1的出错处理*/if(child1==-1){printf("Childlforkerror");cxit(l);}elseif(child1==0)/*在了•进粗1中调川excclp()泊数*/{printf("InchildI:executeIs-rH);if(exec
8、cs.h>#include#includeintmain(void)pid_tchildl,child2,child:/*创述两个子进程*/child1=fork();子进程1的出错处理*/if(child1==-1){printf("Childlforkerror");cxit(l);}elseif(child1==0)/*在了•进粗1中调川excclp()泊数*/{printf("InchildI:executeIs-rH);if(exec
此文档下载收益归作者所有