我怎样才能执行一个外部的Windows命令,并立即在Perl中返回?

我已经尝试使用fork()系统(),尝试exec(),仍然没有得到我所需要的。

我想编写一个Perl脚本,它可以执行5次不同的Perl脚本(发送不同的参数值),但是它可以同时运行。 我意识到我可以把我的脚本变成一个.pm文件,并引用它,但我宁愿保持子脚本独立于父…

  • 系统()工作,但连续执行命令(每个文档有意义)
  • exec()不起作用 – 它只执行第一个方法(每个doc有意义)
  • 我添加了一个fork()到子perl脚本,然后尝试使用system()
  • 这也没有工作。
  • 反向命令“文件说,它的作品相同的系统()…

Perl中没有简单的方法(使用WindowsXP)来执行一个进程,而不关心返回值或antyhing,只是继续进入父脚本的下一行?

在Windows上,您可以将超级密钥1标志赋予系统IIRC。

system 1, @cmd; 

在perlmonks快速谷歌搜索这个问题给: http ://www.perlmonks.org/?node_id=639814

希望有所帮助。

你可以这样做(fork在父级,exec在子级):

 for my $cmd qw(command1 command2 command3) { exec $cmd unless fork } 

exec $cmd unless fork工作, exec $cmd unless fork的方式是fork将在父进程中返回一个真正的值(进程ID),并且将在子进程中返回一个假值,因此,如果fork返回false,则exec $cmd才会运行(也就是in孩子)。

或者如果您想要在同时运行的过程中保持制表符:

 my @procs; for my $cmd qw(cmd1 cmd2 cmd3) { open my $handle, '-|', $cmd or die $!; push @procs, $handle; } 

那么你可以从@procs的元素中@procs如果你需要的话。

或者看一下诸如Forks::Super类的许多cpan模块,它们处理叉子管理的细节。

一个非常轻量级的方法

视窗:

 foreach my $cmd (@cmds) { `start $cmd`; } 

Unix的:

 foreach my $cmd (@cmds) { `$cmd &`; } 

你需要在父进程中分叉,然后在新进程中执行。 它是这样的,假设A是原始的脚本,B是你想要做的5次:

  A1 fork in A1 -> A1 A2 exec B in A2 -> A1 B2 fork in A1 -> A1 A3 B2 exec B in A3 -> A1 B3 B2 

等等

这个工作模块是矫枉过正的。 你想fork创建一个新的进程,然后exec在新进程中运行一个命令。 要运行五个命令,你需要这样的东西:

  for (my $i=0; $i<5; $i++) { if (fork() == 0) { exec($command[$i]); # runs command, doesn't return } }