parent在sleep的时候受到 child 的sig 为啥就不继续sleep了?
时间:2010-11-12
来源:互联网
标题不是很清楚。定义了下 SIG{CHLD}的handler
复制代码
主要是想在child 超时的时候干掉child 。
child 超时的时候能 kill 掉 。但是 不超时的时候parent马上就退出sleep了
为什么会退出sleep呢?
- #!/usr/bin/perl -w
- use strict;
- use POSIX ":sys_wait_h";
- our %liveprocess;
-
- $SIG{CHLD}= sub { while( (my $tmp_chl = waitpid(-1,WNOHANG))>0){print "$tmp_chl was delete \n";delete $liveprocess{$tmp_chl};}};
-
- my $pid = fork();
- if($pid) {
- print "$pid\n";
- $liveprocess{$pid}="";
- sleep 10;
- if( scalar (keys %liveprocess) >0 ){
- my @wait_to_kill=keys %liveprocess;
- kill 9 ,@wait_to_kill;
- }
- print "this is after kill or child finished ,reachit? \n";
- sleep 3;
- print "this is after kill or child finished ,reachit? \n";
-
- }
-
- else {
- print "i am child and iam gonna sleep3 and go to ssh\n";
- sleep 2;
- exit 0 ;
- }
child 超时的时候能 kill 掉 。但是 不超时的时候parent马上就退出sleep了
为什么会退出sleep呢?
作者: nuclearxin 发布时间: 2010-11-12
POSIX就是这么设计的。
如果SIGCHLD不能唤醒sleep会存在很多问题。
比如一个server模式里,parent在循环等待childs的结果,它很多时候会sleep来等待,一旦child有退出,它立刻从sleep中苏醒过来进行处理。
不过,parent里可以临时block掉SIGCHLD。
如果SIGCHLD不能唤醒sleep会存在很多问题。
比如一个server模式里,parent在循环等待childs的结果,它很多时候会sleep来等待,一旦child有退出,它立刻从sleep中苏醒过来进行处理。
不过,parent里可以临时block掉SIGCHLD。
作者: 兰花仙子 发布时间: 2010-11-12
哦。原来与此阿。。。。
其实这样更好。我只等待一个进程。
其实这样更好。我只等待一个进程。
作者: nuclearxin 发布时间: 2010-11-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28