我已经尝试使用fork()系统(),尝试exec(),仍然没有得到我所需要的。
我想编写一个Perl脚本,它可以执行5次不同的Perl脚本(发送不同的参数值),但是它可以同时运行。 我意识到我可以把我的脚本变成一个.pm文件,并引用它,但我宁愿保持子脚本独立于父…
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 } }