我正在编写一个Perl脚本,它将写入一些输入并将这些输入发送到外部程序。有一个小但不为零的机会,这个程序将被挂起,和我想不想来一次出来:如何超时可能挂起的分叉进程?
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
目前的情况是,$ num_secs_to_timeout后,program_of_interest仍然存在。我试图杀死它在匿名子程序$SIG{ALRM}
如下:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
但这并不做任何事情。 program_of_interest仍然存在。我该如何去杀死这个过程?
我认为“kill 9, - $ PID”应该是“kill -9,$ PID”。我使用了系统(“kill -9 $ PID”)。 – Boolean 2013-06-03 19:34:15
我认为“kill -9 $ PID”应该进一步是“kill -9 $ pid”,但是,否定pid表示杀死一个进程组,而不仅仅是一个进程。从kill文档中可以看出:“与shell不同的是,如果SIGNAL为负数,它将杀死进程组而不是进程(在System V上,负的进程号也会终止进程组,但这不是可移植的)” – simpleuser 2014-04-03 17:59:54