问题描述
|
我正在使用“ 0”从Tk GUI执行用户定义的程序,以使GUI不会由于“ 1”调用而冻结。我希望能够从不同于此Perl脚本位置的目录中启动用户定义的程序。
这可能吗?我应该使用其他模块吗?我想要
异步运行该过程。
能够判断该进程是否仍在运行。
能够杀死进程。
同时支持Unix / Linux和Win32。
能够指定进程的当前工作目录。
Proc::Background
满足了除#5以外的所有请求,至少据我所知。
编辑:2011年4月22日
根据建议,我尝试了Forks :: Super,但无法正常工作。例如,我想观察一个信号来杀死/中断一个进程。我使用类似:
my $pid = fork { dir => $my_dir,cmd => [ $my_cmd,$my_args ] };
my $ProcessObj = Forks::Super::Job::get($pid);
while( $ProcessObj->is_active() ) {
if( $run_cmd_die == 1 ) {
$ProcessObj->kill(1);
}
}
这将永远不会退出while循环。
我的最终解决方案是修改“ 0”以满足我的需求。我在options哈希中添加了一个新的可选条目,并将options哈希传递给Win32和Unix的_new
子例程。然后,我可以为Win32 :: Process :: Create调用提供目录,并为Unix使用chdir。
解决方法
天真的实现是在运行Proc :: Background函数以启动其他进程之前仅chdir,然后立即chdir返回。
,
Forks::Super
v0.51支持所有这五个功能。
use Forks::Super;
# launch $command $arg1 $arg2 in background,starting from dir $directory
$pid = fork { dir => $directory,cmd => [ $command,$arg1,$arg2 ],... };
# check if process is still running
if (! $pid->is_complete) { ... }
# kill a process. Straightforward on UNIX,DWIM on Win32
$num_signalled = kill \'TERM\',$pid;
$pid->kill($signal); # alternate