操作系统实验2 2 wait函数_第1页
操作系统实验2 2 wait函数_第2页
操作系统实验2 2 wait函数_第3页
操作系统实验2 2 wait函数_第4页
操作系统实验2 2 wait函数_第5页
已阅读5页,还剩2页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

实验目标:wait()waitpid()的函数使用原理和范例。 wait(等待子进程中断或结束)wait,就立即阻塞自己,wait个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait#include<sys/types.h>/*pid_t*/定义函数pid_twait(int*status返回,而子进程的进程识别码也会一快返statusintNULL,pid=wait(NULL)waitID,wait1,errnoECHILD。/*wait1.c#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdlib.h>{pid_tpc,pr; /**/printf("errorocurred!\n");elseif(pc==0){ /*如果是子进程*/printf("Thisischildprocesswithpidof /*10} /**/pr=wait(NULL);/*在这里等待*/printf("Icatchedachildprocesswithpidof}}$ccwait1.c-o$ThisischildprocesswithpidofIcatchedachildprocesswithpidof210秒钟的等待时间,这就是父进程都会一直等待下去,读者如果有的话,可以试着自己修改一下这个数NULLwait入其中,这是一个整数值(int),了子进程是正常退出还是被结束一套专门的宏(macro)来完成这项工作,下面我们来学下其中最常用的两1,WIFEXITED(status)这个宏用来子进程是否为正常退出的,如果是,它status,而是那个指针所指向的整数,切记不要搞混了。)exit(5)退出,WEXITSTATUS(status)如果进程不是正常退出的,也就是说,WIFEXITED0,/*wait2.c#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>{intstatus;pid_tpc,pr; /*如果出错*/printf("errorocurred!\n");elseif(pc==0){/*子进程printf("Thisischildprocesswithpidof%d.\n",getpid()); /*3} /**/if(WIFEXITED(status)){/*WIFEXITED*/printf("thechildprocess%dexitprintf("thereturnis /*WIFEXITED*/printf("thechildprocess%dexit}}$ccwait2.c-o$Thisischildprocesswithpidof1538.thechildprocess1538exitnormally.thereturncodeis3.3,很少用到,就也不在这里浪费篇幅介绍了,有的读者可以自己参阅Linuxmanpagesint{pid_tpid;intstatus,i;if(fork()={printf(“Thisisthechildprocess.pid=%d\n”,getpid());}printf(“Thisistheparentprocess,waitforchild...\n”);pid=wait(&status);i=printf(“child’spid=%d.exit}}ThisisthechildThisistheparentprocess.waitforchild’spid=1501,exitstatus5waitpid(等待子进断或结束)#include<sys/types.h>/*pid_t*/定义函数pid_twaitpid(pid_tpid,int*status,intpidpid>0时,只等待进程ID等于pid的程,不管其它已经有多少pid=-1时,等待任何一个程退出,没有任何限制,此时waitpidwait的进程组,waitpidpidoption0OR。WNOHANG如果没有任何已经结束的程则马上返回,不予以等待。WUNTRACED如果程进入暂停执行情况则马上返回,但结束状态不予以理会程的结束状态返回后存于status,有几个宏可判别结束情况:。WIFEXITED(status)如果程正常结束则为非0值。WEXITSTATUS(status)取得程exit()返回的结束代码,一般会先用WIFEXITED来判断是否正常结束才能使用此宏。WIFSIGNALED(status)如果程是因为信号而结束则此宏值为真WTERMSIG(status)取得程因信号而中止的信号代码,一般会先用WIFSIGNALED来判断后才使用此宏。WIFSTOPPED(status)如果程处于暂停执行情况则此宏值为真。一般只有WUNTRACED时才会有此情况。返回值如果执行成功则返回程识别码(PID),如果有错误发生则返回-1。errno中。optionswaitpid,LinuxWNOHANGWUNTRACED"|"运算符把它们连接起来使用,比如:ret=waitpid(-1,NULL,WNOHANG|WUNTRACED);如果我们不想options0,如:ret=waitpid(-1,NULL,0);如果使用wait那样等下去。而WUNTRACED参数,由于涉及到一些调试方面的知识,加之极少用到, 看到这里,聪明的读者可能已经看出端倪了--wait不就是经过包装的waitpid吗?没错,察看<内核源码 >/include/unistd.h文件349-352行就staticinlinepid_twait(int*{returnwaitpid(-}3./*waitpid.c*/#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>{pid_tpc, /*fork*/printf("Erroroccuredonforking.\n");elseif(pc==0){ /*如果是程*/ /*睡眠10秒*/}/**/pr=waitpid(pc,NULL,WNOHANG);/*WNOHANGwaitpid /*如果没有收集到printf("Nochildexited\n");} /*没有收集到程,就回去继续尝试*/printf("successfullygetchild%d\n",}

printf("someerror$ccwaitpid.c-o$NochildexitedNochildexited

温馨提示

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

评论

0/150

提交评论