使用Proc :: Background时更改工作目录

问题描述

| 我正在使用“ 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