<转载>Wait and Waitpid
2013-10-22 06:06
281 查看
转载http://www.cnblogs.com/lihaosky/articles/1673341.html
一、Wait
简介
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进 程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:
如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
实战
下面
编译并运行:
可以明显注意到,在第2行结果打印出来前有10秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退 出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数 值,看看会出现怎样的结果。
一、Wait
#include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status)
简介
进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进 程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:
pid = wait(NULL);
如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
实战
/* wait1.c */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> main() { pid_t pc,pr; pc=fork(); if(pc<0) /* 如果出错 */ printf("error ocurred!\n"); else if(pc==0){ /* 如果是子进程 */ printf("This is child process with pid of %d\n",getpid()); sleep(10); /* 睡眠10秒钟 */ } else{ /* 如果是父进程 */ pr=wait(NULL); /* 在这里等待 */ printf("I catched a child process with pid of %d\n"),pr); } exit(0); }
下面
编译并运行:
$ cc wait1.c -o wait1 $ ./wait1 This is child process with pid of 1508 I catched a child process with pid of 1508
可以明显注意到,在第2行结果打印出来前有10秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退 出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数 值,看看会出现怎样的结果。
相关文章推荐
- <转载>条件变量(互斥量)与pthread_cond_wait函数详解
- Perl的基本语法<总结> (转载)
- Time, Delays, and Deferred Work <LDD3> 学习笔记 + jiffies.h 分析
- web.xml is missing and <failOnMissingWebXml> is set to true
- <转载>让WinForms窗口随鼠标左键移动
- Difference between <? super T> and <? extends T> in Java
- Go的异常处理 defer, panic, recover<转载>
- 转载:如何理解jsp页面中的“<base href="<%=basePath%>">”?
- <转载>大白话系列之C#委托与事件讲解(序言)
- &lt;转载&gt;激发程序员创意的几本书
- logback 配置详解(一)<configuration> and <logger>
- <转载>深层揭密extern "C"
- Kids and Prizes 来源: <http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85996#problem/B>
- web.xml is missing and <failOnMissingWebXml> is set to true
- ORACLE修改数据库名<转载>
- error: insufficient permissions for device(解决adb shell问题)<转载>
- XSLT(6) Function named templates and <xsl:call-template>
- Android 开发 Tip 15 -- can be replaced by one <TextView/> and a compound drawable
- ACPI<Advanced Configuration and Power Interface >
- <转载>Java 加密解密之对称加密算法AES