Ich versuche, Perl5 zu fork()
einen untergeordneten Prozess zu verwenden. Der untergeordnete Prozess sollte exec()
ein anderes Programm sein, das seine STDIN
an eine Named Pipe und STDOUT
und STDERR
an Protokolldateien umleitet. Der übergeordnete Prozess wird weiterhin in einer Schleife ausgeführt, wobei waitpid
verwendet wird und $?
überprüft wird, um das untergeordnete Element neu zu starten, falls es mit einem Nicht-Null-Exit-Status endet.Redirect STDOUT und STDERR in exec() ... ohne Shell
Perl-Dokumentation für die exec()
Funktion sagt:
Wenn es mehr als ein Argument in LIST ist, dies nennt execvp (3) mit den Argumenten in LIST. Wenn nur ein Element in LIST vorhanden ist, wird das Argument auf Shell-Metazeichen überprüft, und falls vorhanden, wird das gesamte Argument an die Befehlshell des Systems zum Parsen übergeben (dies ist
/bin/sh -c
auf Unix-Plattformen, variiert jedoch auf anderen Plattformen). Wenn das Argument keine Shell-Metazeichen enthält, wird es in Wörter aufgeteilt und direkt anexecvp
übergeben, was effizienter ist. Beispiele:exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq";
Das klingt ziemlich cool, und ich möchte mein externes Programm ohne Vermittler Shell auszuführen, wie in diesen Beispielen gezeigt. Leider kann ich dies nicht mit der Ausgabeumleitung kombinieren (wie in /bin/foo > /tmp/stdout
).
Mit anderen Worten, das funktioniert nicht:
exec ('/bin/ls', '/etc', '>/tmp/stdout');
Also, meine Frage ist: Wie leite ich die STD*
Dateien für meinen Unter Befehl, ohne die Schale mit?