[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: