WINDOWS下PERL强制结束子进程或线程
WINDOWS下PERL强制结束子进程或线程
下面讨论只针对WINDOWS下的PERL,我用的是activeperl 5.8.8
我通过发信号通知子进程退出,但是:
1。不能发送KILL信号,因为文档上明确表示这将导致典型的内存泄漏
2。发送其它信号,经常(如socket等待,select阻塞等)被阻塞或丢失
例:
use strict;
use warnings;
use IO::Socket::INET;
use threads;
$|=1;
my $pid = fork;
if ($pid == 0) {
# 创建进程后将使用约20M内存
my @a;
$a[5000000] =1;
my $end = 0;
# $SIG{INT} = sub {print "recv int\n"; $end=1};
$SIG{INT} = sub {print "recv int\n"; $end=1; exit};
# my $sock = new IO::Socket::INET (LocalPort=>1234, Proto=>'udp')
# or die "cannot create sock\n";
while (1) {
print "haha\n";
select undef, undef, undef, 1; # select 中无法接收信号
# sleep 200; # sleep可以接收信号,但信号处理完后会继续sleep结束
# $sock->recv($_, 100); # 进程在IO阻塞时无法接收信号
last if $end;
# print "recv $_\n";
}
print "quit process\n";
exit;
};
sleep 2;
printf "kill ret: %d\n", kill INT=>$pid;
wait;
print "done.\n";
# 这时查看进程管理器中的内存变化
sleep 10;
如果这个例子用threads线程方式来写,也有类似的问题,而且,甚至像sleep等操作也会阻塞延迟信号处理
请问WINDOWS下PERL如何强制结束一个子进程/线程?或者用KILL信号,能否手工清理内存?