我想生成一个进程,做一些事情,然后在我完成后手动杀死它。
虽然它不起作用。该过程开始,我看到pid和while循环一直运行,直到我杀了它。
可能是,Perl会生成一个新shell,然后生成UI进程,当shell(Perl生成的)被杀死时,它不会被Perl杀死?
my $cmd = "notepad.exe";
my $sleepTime = 10;#60 * 10;
$childPid = fork();
if ($childPid)
{ # Parent
print "Started child process id: $childPid\n";
sleep $sleepTime;
$SIG{CHLD} = 'IGNORE';
while (kill(15, $childPid))
{
my $numKilled = kill(SIGTERM, $childPid);
printf("numKilled: %s\n", $numKilled);
printf("numKilled: %s\n", $childPid);
sleep 1;
}
}
elsif ($childPid == 0)
{ # Child
system($cmd);
exit 0; # will never get here
}
else
{ # Unable to fork
die "ERROR: Could not fork new process: $!\n\n";
}
答案 0 :(得分:1)
Forks::Super
模块为处理分叉进程提供了许多有用的工具,并提供了更便携的界面。
此程序运行notepad
以编辑程序自己的源文件,并在五秒后终止子进程。如果需要将参数传递给命令,则应将其指定为像这样的匿名数组。如果你使用像cmd => qq<notepad "$0">
这样的单个字符串,那么你将启动cmd.exe的副本,而cmd.exe又会启动notepad.exe,而kill
命令只会让记事本作为孤儿运行
use strict;
use warnings;
use Forks::Super;
if ( my $pid = fork({ cmd => [ 'notepad', $0 ] }) ) {
sleep 5;
Forks::Super::kill('TERM', $pid);
print "Killed\n";
}
请注意,如果要对子进程应用超时,则可以编写
my $pid = fork({ cmd => 'notepad', timeout => 600 })