免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6522 | 回复: 13
打印 上一主题 下一主题

wait waitpid 区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-17 10:27 |只看该作者 |倒序浏览
20可用积分
调用w a i t或w a i t p i d的进程可能会:
• 阻塞(如果其所有子进程都还在运行)。
• 带子进程的终止状态立即返回(如果一个子进程已终止,正等待父进程存取其终止状态)。
• 出错立即返回(如果它没有任何子进程)。

waitpid提供了wait的非阻塞版本

问题:此处阻塞该如何理解,调用wait,如果没有子进程终止则父进程在此轮询,直到有子进程终止wait函数返回,父进程才可以继续执行是吗?  如果是,那么waitpid的非阻塞呢,父进程调用waitpid没有子进程终止,则waitpid立即返回0,父进程继续执行,如果随后一个子进程终止,因为waitpid已经返回了,那么父进程还能获得子进程结束的相关信息吗?

论坛徽章:
0
2 [报告]
发表于 2009-02-17 10:34 |只看该作者
在父进程中捕获SIGCHLD信号,然后在信号处理函数中调用waitpid的非阻塞版本。
具体的实现可以参考UNIX网络编程第一卷的5.10节。有完整的代码。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2009-02-17 10:57 |只看该作者

回复 #1 tianhailong 的帖子

APUE里面应该也有说明的

论坛徽章:
0
4 [报告]
发表于 2009-02-17 10:58 |只看该作者
1,在一子进程终止前,wait使调用者阻塞,而waitpid有一个选项可使调用者不阻塞
2,waitpid有若干选项,它并不等待第一个子进程终止,可以控制它所等待的子进程

论坛徽章:
0
5 [报告]
发表于 2009-02-17 11:00 |只看该作者
原帖由 tianhailong 于 2009-2-17 10:27 发表
调用w a i t或w a i t p i d的进程可能会:
• 阻塞(如果其所有子进程都还在运行)。
• 带子进程的终止状态立即返回(如果一个子进程已终止,正等待父进程存取其终止状态)。
• 出错立即返回( ...

如果父进程的waitpid在子进程结束前就返回,那么你需要在下一次再次调用wait或者waitpid(看看这个函数的选项)以获得子进程退出状态

论坛徽章:
0
6 [报告]
发表于 2009-02-17 12:02 |只看该作者
调用w a i t或w a i t p i d的进程可能会:
• 阻塞(如果其所有子进程都还在运行)。
• 带子进程的终止状态立即返回(如果一个子进程已终止,正等待父进程存取其终止状态)。
• 出错立即返回(如果它没有任何子进程)。

waitpid提供了wait的非阻塞版本

问题:此处阻塞该如何理解,

阻塞的意思就是wait 或者waitpid 不返回,程序在这里等待条件满足才返回

调用wait,如果没有子进程终止则父进程在此轮询,直到有子进程终止wait函数返回,父进程才可以继续执行是吗?
是的,父进程调用wait,wait返回的条件是有子进程退出,wait返回了,后面的代码才会执行

如果是,那么waitpid的非阻塞呢,
如果父进程调用waitpid函数的时候,第三个参数设置WNOHANG,那么父进程就不会在waitpid处阻塞,即使没有进程符合waitpid中等待的条件,waitpid也会立即返回0

父进程调用waitpid没有子进程终止,则waitpid立即返回0,父进程继续执行,如果随后一个子进程终止,因为waitpid已经返回了,那么父进程还能获得子进程结束的相关信息吗?
所以你最好在父进程中设置SIG_CHILD信号处理函数,当有子进程退出的时候,父进程会收到SIG_CHILD信号
在信号处理函数内部调用wait或者waitpid来收集子进程的返回信息,这样就不会发生父进程不能获得子进程结束时的返回信息了

关于wait ,waitpid unix环境高级编程中有一节section 8.6 wait and waitpid functions 作了详细的介绍。
楼主可以看一下

[ 本帖最后由 zhuhefang2006 于 2009-2-17 12:04 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-02-17 12:21 |只看该作者
捕获SIGCHLD信号是比较适当的做法

论坛徽章:
0
8 [报告]
发表于 2009-02-17 14:01 |只看该作者
非常感谢诸位的讲解,我现在正在看《unix环境高级编程》,就是对其中的部分内容不太明白,才请教大家的,谢谢!

论坛徽章:
0
9 [报告]
发表于 2009-02-17 14:05 |只看该作者
原帖由 zhuhefang2006 于 2009-2-17 12:02 发表
调用w a i t或w a i t p i d的进程可能会:
• 阻塞(如果其所有子进程都还在运行)。
• 带子进程的终止状态立即返回(如果一个子进程已终止,正等待父进程存取其终止状态)。
• 出错立即返回( ...



如果在signal中的信号处理函数中调用wait/waitpid,那么只有父进程接收到SIGCHLD信号时,才会调用,而此时又有子进程终止,则wait/waitpid会立即返回,此时也就无所谓阻塞、非阻塞了吧?

论坛徽章:
0
10 [报告]
发表于 2009-02-17 14:23 |只看该作者
后一个是后面跟了个pid,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP