为什么子进程无法被kill掉呢?
时间:2010-10-27
来源:互联网
程序是用来读取网页数据的,当网页反应比较慢,则不再等待,重新读取一遍。
我用了管道来实现进程通信,子进程进行网页的读取,父进程判断状态。父进程等待子进程5秒,如果5秒还没有读取完成,那么结束子进程。
但是如果子进程没有完成读取工作,kill $pid;就不发挥作用,也就是说父进程无法强行终止子进程,请问这是为什么呢?
#!/usr/bin/perl
use strict;
use POSIX;
use HTML::TreeBuilder 3;
#gethtml
sub getHtmlContent {
use LWP::Simple;
my ($url) = @_;
my $content = get($url);
#print($content);
return $content
}
pipe (INPUT, OUTPUT);
my $i = 0;
do{
my $pid=fork();
if (!defined($pid)) {
print "Error in fork: $!";
exit 1;
}
#father
if($pid!=0)
{
my $fid=getppid();
close (OUTPUT);
sleep 5;
print <INPUT>;
kill $pid;
$i=3;
}
#child
else
{
my $temp="";
$htmlcontent="";
close (INPUT);
$temp=&getHtmlContent("http://www.chinaunix.net");
print OUTPUT ($temp);
#exit(1);
}
sleep 1;
$i++;
}
while($i<2 && $flag==1);
exit 0
我用了管道来实现进程通信,子进程进行网页的读取,父进程判断状态。父进程等待子进程5秒,如果5秒还没有读取完成,那么结束子进程。
但是如果子进程没有完成读取工作,kill $pid;就不发挥作用,也就是说父进程无法强行终止子进程,请问这是为什么呢?
#!/usr/bin/perl
use strict;
use POSIX;
use HTML::TreeBuilder 3;
#gethtml
sub getHtmlContent {
use LWP::Simple;
my ($url) = @_;
my $content = get($url);
#print($content);
return $content
}
pipe (INPUT, OUTPUT);
my $i = 0;
do{
my $pid=fork();
if (!defined($pid)) {
print "Error in fork: $!";
exit 1;
}
#father
if($pid!=0)
{
my $fid=getppid();
close (OUTPUT);
sleep 5;
print <INPUT>;
kill $pid;
$i=3;
}
#child
else
{
my $temp="";
$htmlcontent="";
close (INPUT);
$temp=&getHtmlContent("http://www.chinaunix.net");
print OUTPUT ($temp);
#exit(1);
}
sleep 1;
$i++;
}
while($i<2 && $flag==1);
exit 0
作者: hamas 发布时间: 2010-10-27
本帖最后由 zhlong8 于 2010-10-27 12:19 编辑
father 里面 print <INPUT> 是个 list context 吧?
father 里面 print <INPUT> 是个 list context 吧?
作者: zhlong8 发布时间: 2010-10-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28