我正在使用Proc::Background
从Tk GUI执行用户定义的程序,以便GUI不会因system
调用而冻结。我希望能够从与Perl脚本的位置不同的目录启动用户定义的程序。
这可能吗?我应该使用不同的模块吗?我想
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循环。
我的最终解决方案是修改Proc::Background
以满足我的需求。我在options hash中添加了一个新的可选条目,并将选项hash传递给Win32和Unix的_new
子例程。然后我可以将目录提供给Win32的Win32 :: Process :: Create调用,并为Unix使用chdir。
答案 0 :(得分:1)
一个天真的实现就是在运行Proc :: Background函数之前启动另一个进程然后立即返回chdir。
答案 1 :(得分:1)
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