欢迎来到天天文库
浏览记录
ID:31747714
大小:53.98 KB
页数:7页
时间:2019-01-17
《实验七编写多进程程序1》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、®南昌大学卖验报告一、实验项目名称《编写多进程程序和守护程序》二、实验目的通过编写多进程程序,使读者熟练掌握fork().exec().wait()^waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。(守护进程)通过编写一个完整的守护进程,使读者掌握守护进程编写和调试的方法,并且进一步熟悉如何编写多进程程疗;三、实验内容该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行"Is-1”指令,另一个子进程在暂停5s之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的
2、信息,父进程就返冋。(守护进程)在该实验中,读者首先建立起一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。在这里,子进程和守护进程的退出消息都在系统日志文件(例如“/var/log/messages”,日志文件的全路径名因版本的不同可能会有所不同)中输出。子进程退出后,守护进程循环暂停,其问隔时间为10so四、实验步骤(1)画出该实验流程图该实验流程图如图所示。图实验7」流程图(2)实验源代码(multi_proc.c)先看一下下面的代码,这个程序能得到我们所希望的结果吗,它的运行会产生儿个进程?回忆一下fork()调用
3、的具体过程。/*multi_proc_wrong.c*/#includc#include#include#include#includeintinain(void){pid_tchild1,child?,child;/*创建两个子进程勺child1=fork();child2=fork();/*子进程1的出错处理审if(child1==-l){prin(f(MChildlforkerrorH);exit(l);}elseif(child1==0)/*在子进程1中调用execlp
4、O函数可{printfC'Inchild1:execute*ls-r°);if(execlp(,,ls,NULL)<0){printf(°ChildlexeclperrorM);}}if(child?==-!)/*子进程2的出错处理勺printf(MChild2forkerrorM);exit(l);elseif(child?==0)/*在子进程2中使其暂停5s*/{printf(Mlnchild2:sleepfor5secondsandthenexitM);sleep(5);exit(O);}else/*在父进程中等待两个子进程的退岀*/{printf(HInfath
5、erproccss:");child=waitpid(childl,NULL,0);/*阻塞式等待*/if(child==child1){printf(MGetchild1exitcodeM);}else{printf(MErroroccured!H);}do{child=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/if(child==0){printf(HThechild2processhasnotexited!M);sleep(l);1}while(child=0);if(child==child2){printf(MGetchik!
6、2exitcode,f);)else{printf(MErroroccured!n);1}exit(0);编译和运行以上代码,并观察其运行结果。它的结果是我们所希望的吗?看完前而的代码之后,再观察下面的代码,它们之间有什么区别,会解决哪些问题。/*multLproc.c*/#include#include#includc#include#includeinimain(void)pidjchildl,child2,child;/*创建两个子进程勺child1=fork();
7、/*子进程1的出错处理勺if(child1==-1){prinlfC'ChikilforkcrrorH);exit(l);}elseif(childI==0)/*在子进程1中调用cxcclp()函数*/{printf(MInchild1:execute*lsif(execlp(MlsfNULL)<0){printfC'Childlexeclperror,t);}}else/*在父进程中再创建进程2,然后等待两个子进程的退出
此文档下载收益归作者所有