Sie ein piped open den Prozess verwenden könnte, ala
use 5.013;
use warnings;
use autodie;
open my $cmd1_fh, '-|', 'dir';
open my $cmd2_fh, '-|', 'cls';
Oder, wenn Sie nicht über den Ausgang egal, fork und dann exec:
my @child_pids;
for my $cmd ('dir', 'cls') {
defined(my $child_pid = fork()) or die "Couldn't fork: $!";
if ($child_pid == 0) {
exec $cmd;
} else {
push @child_pids, $child_pid;
}
}
for my $pid (@child_pids) {
waitpid($pid, 0);
}
(Wenn Sie sich um den Ausgang kümmern, Gabel und dann Backtick?)
Oder benutze Threads (Ich bin nicht stolz auf dieses Beispiel, und ich habe es noch nicht einmal geschrieben. Sehen Sie ein Beispiel mit Gewinde :: Queue für etwas viel weniger schrecklich)
use threads;
my @threads;
for my $cmd ('dir', 'cls') {
push @threads, threads->create(sub { system @_ }, $cmd);
}
$_->join for @threads;
Es gibt auch mehrere Module, die Ihnen mit diesem, wie Parallel::ForkManager und Win32::Job helfen.
Ich würde die Backticks zu System() Anruf beheben. +1 sowieso. – DVK
Systemaufruf ruft einen "exec" auf - wird nicht von der Shell interpretiert. Es ist die Shell, die das "&" interpretiert und im Hintergrund läuft - also würde das System nicht funktionieren. – Brad
inkorrekt: 'system' kann oder kann keine Shell zum Analysieren der Argumente aufrufen, abhängig davon, wie viele Argumente Sie übergeben haben. Auch IPC :: System :: Simple hat einige Methoden, die das Aufrufen der Shell erzwingen können. – Ether