Hallo Alexander,
danke für Deine Tipps.
use strict und das -T werde ich einbauen, $ENV{'PATH'} werde ich mir auch noch ausgeben lassen, und das "undef" bei fork() werde ich ebenfalls noch prüfen. Das Ergebnis werde ich dann posten.
Guter Plan.
Der Hinweis wegen den Backticks ist sicherlich generell berechtigt, in meinem Fall werden aber keine Benutzereingaben eingefügt. Es soll ganz stupide ein und das selbe Programm ausgeführt werden, und der Dateiname der temporären Datei, auf die es zugreift, wird vom Skript bestimmt, und nicht vom Anwender.
Ist der Name vorhersagbar? Dann hast Du immer noch ein Problem, wenn auch ein anderes.
* waitpid(-1) wartet auf alle Kindprozesse, nicht nur auf den gerade gestarteten. Das sollte hier eigentlich harmlos sein.
Wie kann ich das Skript denn auf genau den gerade gestarteten warten lassen?
Siehe Dokumentation zu waitpid.
* Der Rückgabewert von waitpid() ist nicht notwendigerweise -1, siehe perlfunc-Manpage.
So tief wollte ich eigentlich gar nicht in die Materie einsteigen.
Würdest Du dich nach 20 Minuten am MS Flight Simulator ans Steuer einer 747 wagen, um sie von Frankfurt nach NY zu fliegen? Du wirst kaum darum herumkommen, wenigstens die essenziellen Teile der Perl-Dokumentation durchzuarbeiten. Damit kommst Du zwar auch nicht nach NY, aber zumindest darfst Du dann schonmal aufs Rollfeld gehen und vielleicht sogar aus dem Cockpit-Fenster sehen. ;-)
Meine Vorlage war dieses Beispiel aus selfhtml: http://de.selfhtml.org/perl/funktionen/systemaufrufe.htm#waitpid
Falls Du das Beispiel für so schlecht hältst - vielleicht könntest Du eine bessere Version davon einstellen, dann haben alle etwas davon?
Unnötig, die Perl-Dokumentation ist für diesen Fall ausreichend und auch auf Deutsch verfügbar.
* Die perlipc-Manpage dokumentiert unter "Safe Pipe Opens", wie sichere IPC mit einer Kopie des Prozesses oder auch mit einem anderen Prozess funktioniert. Das ist der offiziell empfohlene Weg, um I/O mit anderen Programmen zu machen.
Hm, ich *dachte* eigentlich, dass ich die Kommunikationsgeschichte auch aus einem selfhtml-Beispiel hatte, aber so spontan finde ich es nicht mehr.
Ich habe den Verdacht, Du planst ein Haus, in dem Du Stücke aus den Konstruktionsplänen von Sanssoussi, dem Eiffelturm, der Berliner Mauer, dem Telemichel und der Titanic rausreißt und mit reichlich Kleister auf dem Plan vom VW Käfer zusammenklebst. Das Ergebnis wird in aller Regel nicht zu Deinem Traumhaus führen.
Ich habe mir auf Deinen Rat hin mal http://www.ccsf.edu/Pub/Perl/perlipc/Safe_Pipe_Opens.html angeschaut, aber irgendwie schafft das bei mir eher noch mehr Verwirrung. :-(
Probier's mal mit http://perldoc.perl.org/ bzw. http://perldoc.perl.org/perlipc.html, dort ist die Dokumentation nicht zu Konfetti verarbeitet.
Ich will doch einfach nur, dass mein Hauptprogramm eine sich wiederholende Wartemeldung ausgibt, bis der externe Befehl sein Ergebnis zurückgeliefert hat, und anschließend will ich dieses Ergebnis weiterverarbeiten. Ist das wirklich so schwer?
Wenn Du Dich mit der Dokumentation ernsthaft befaßt, nein.
Wobei mir noch nicht so ganz in den Kopf will, warum Du den Webserver mit zusätzlicher Arbeit belasten willst, während ein ohnehin langsames Programm läuft. Wenn Du dem Benutzer Aktivität vorgaukeln willst, benutze ein animiertes GIF, das Du nach Ende der langen Arbeit ausblendest oder ersetzt. Oder verarbeite die Ausgabe des Kindprozesses direkt im CGI, noch während der Kindprozess die Ausgabe anliefert. Das dürfte in aller Regel die effizienteste Lösung sein.
Alexander