Wenn du einen Prozess forkst bekommst du zwei unabhängige Prozesse, die keinerlei Variablen miteinander teilen. Du kannst also nicht in einem Prozess in
$output schreiben und hoffen, das das Ergebnis im anderen Prozess ankommt.
Außerdem wartet
waitpid darauf, das ein Prozess sich selber beendet. Willst du es erzwingen musst du
kill nutzen. Das würde in deinem Beispiel auch nicht unbedingt zu einem Ergebnis führen, da ein über
qx gestarteter Kindprozess weiter laufen kann auch wenn der Elternprozess beendet wurde.
Hier ein paar Beispiele wie du das machen kannst:
Am einfachsten ist es mit
IPC::Run:
more (4.6kb)
Oder über open:
more (7.2kb)
oder über eine temporäre Datei:
more (14.3kb)
Man kann anstatt einer temporären Datei auch eine Pipe nutzen. Da ist es aber einfacher
IPC::Run zu nutzen. Das macht es intern so, ist aber System unabhängig programmiert (Windows macht Probleme bei Pipes).
EDIT:
Hier mit einer Pipe:
more (13.2kb)
Das Problem ist, das manche Programme darauf achten ob STDOUT ein Terminal ist. Wenn dem nicht so ist kann die Ausgabe verloren gehen, da sie gepuffert wird.
Mit einem virtuellem Terminal umgeht man das Problem.
Hier ein Beispiel mit
IO::Pty als virtuelles Terminal:
more (13.7kb)
Last edited: 2011-07-07 05:50:26 +0200 (CEST)