2796|1

1560

帖子

24

TA的资源

五彩晶圆(初级)

楼主
 

2440学习(十)wait和waitpid函数 [复制链接]

本帖最后由 lonerzf 于 2014-7-29 16:11 编辑

主要参考文献
  blog.csdn.net/fengwei321123/article/details/9301409     
  blog.csdn.net/newnewman80/article/details/8150052  
上节讲到,僵尸进程产生的一个很典型原因是如果子进程先于父进程退出, 同时父进程又没有调用wait/waitpid函数,则该子进程将成为僵尸进程。


消除僵尸进程的方法大致有一下两个:
1  改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
2  把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill -9 也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。


这一节主要复习wait和waitpid函数。


wait() 函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
waitpid() 函数的作用和wait()一样,但它并不一定要等待第一个终止的子进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的 wait()功能,也能支持作业控制。实际上,wait()函数只是 waitpid()函数的一个特例,在Linux 内部实现 wait()函数时直接调用的就是waitpid()函数。

wait和waitpid函数使用方法如下:





知道了这两个函数的声明之后做一个简单实验对比下两种方法(采用阻塞和非阻塞)。

先看wait函数的使用


运行结果


可见父进程阻塞了5s中时间来等待子进程的退出。


waitpid函数的使用





以上就是wait和waitpid两种方法的基础应用。好处呢,就是可以通过这两个函数为清理子进程,防止僵尸进程的产生。


这一节就到这里吧。





此帖出自Linux开发论坛

最新回复

多谢楼主分享!  详情 回复 发表于 2014-8-7 10:55

赞赏

1

查看全部赞赏

点赞 关注
个人签名这孩子,成熟的象征,理智的典范。

回复
举报

241

帖子

4

TA的资源

纯净的硅(初级)

沙发
 
多谢楼主分享!
此帖出自Linux开发论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表