Re: [OT] Perl: Subshell
Hi,
Moritz Karbach wrote:
> Das externe Kommando, das ich ausführen will, ist
> "executable < steering.txt > logfile.txt"
>
> Ich forke, und rufe das Kommando im Child mit exec auf. Da aber
> Shell-Metazeichen im Kommando sind, ruft Perl erstmal "sh -c" auf, und
> dieser Prozess bekommt dann die Child process id. Ich stehe also
> wieder ohne die id von meinem "eigentlichen" externen Prozess da :-/
ah, klar. Die Lösung ist simpel, in deinem Child tust du einfach schon
STDIN und STDOUT umbiegen. Wenn du dann "executable" exec()st,
übernimmt es die File-Deskriptoren des Vaters (also dein umgebogenes
STDIN und STDOUT), und perl muss keine Shell mehr starten, um
Metazeichen zu interpretieren.
Das sieht dann z.B. so aus:
# Wenn wir das Kind sind...
if(fork == 0) {
# Zuerst die späteren neuen STDINs und STDOUTs öffnen.
open my $infh, "<", "steering.txt" or
die "Couldn't open «steering.txt» for reading: $!\n";
open my $outfh, ">", "logfile.txt" or
die "Couldn't open «logfile.txt» for writing: $!\n";
# Und jetzt STDIN/STDOUT umbiegen:
open STDIN, ">&", $infh or die "Couldn't replace STDIN: $!\n";
open STDOUT, ">&", $outfh or die "Couldn't replace STDOUT: $!\n";
# Und jetzt schließlich den eigentlichen Prozess aufrufen:
exec "executable" or die "Couldn't exec «executable»: $!\n";
}
> PS: Ich bin auch dankbar für eine angesagte Perl Mailinglist, ich weiß
> dass es ja hier eingentlich OT ist.
comp.lang.perl.*, de.comp.lang.perl.*, http://perlmonks.org/, #perl auf
Freenode
--Ingo
--
Linux, the choice of a GNU | Running Windows on a Pentium is like having
generation on a dual AMD | a brand new Porsche but only be able to
Athlon! | drive backwards with the handbrake on.
Reply to: