Kann ein system()
-Aufruf in Perl 5 jemals die
enthalten?
(mit anderen Worten, um ein Programm, das einen system()
-Aufruf ausführt, zu 100% crashsicher zu machen, muss in einen eval
-Block eingeschlossen werden, oder ist es das vollständig? total unnötig?)
Ich habe in perldoc system
keine einzige Erwähnung dieser Möglichkeit gefunden, aber nicht ganz finde den genauen "dieser Ruf stirbt nie" auch nicht.
HINWEIS: Die Frage bezieht sich hier auf grundlegende CORE-Perl, kein autodie
oder irgendein anderes benutzerdefiniertes Modul, das einen ähnlichen Effekt hätte. Nehmen Sie außerdem an, dass kein ALRM
-Signal oder ein anderer benutzerdefinierter Signal-Handler gesetzt wurde.
Ich gehe davon aus, dass alle Versionen von Perl 5. * sich gleich verhalten, aber wenn nicht, würde eine Antwort zu 5.8 geschätzt werden.
Wenn meine Interpretation der Quelle nicht korrekt ist, sieht das wie eine Möglichkeit aus:
Quelle: Perl 5.16.2 (auch geprüft 5.8.8), Datei: pp_sys.c, Zeile: 4224 innerhalb des PP(pp_system)
-Code-Blocks:
DIE
ist Perl_die(pTHX_ const* pat, ...)
in util.c
Gemäß der Dokumentation bedeutet "panic: kid popen errno read", dass "das gegabelte Kind eine unverständliche Nachricht über sein Errno zurückgegeben hat".
Erklärung von panic
-Nachrichten in Perl :
Die Konvention ist, dass wenn der Dolmetscher mit einem internen stirbt Fehler, die Nachricht startet "Panik:". Historisch gesehen, viele Panikmeldungen hatte knappe feste Saiten, was bedeutet, dass die Werte außerhalb des zulässigen Bereichs Das ausgelöst die Panik sind verloren. Jetzt versuchen wir, diese Werte zu melden, als solche sind Panics möglicherweise nicht wiederholbar und die ursprüngliche Fehlermeldung vielleicht die einzige Diagnose, die wir bekommen, wenn wir versuchen, die Ursache zu finden.
system
gibt den Exit-Status des Programms zurück. Das heißt, wenn das Programm abstürzt, wird das aufrufende Perl-Skript fortgesetzt (siehe System ).
Trotzdem kann das Programm selbst immer noch das aufrufende Skript beenden oder sogar den Computer zum Absturz bringen. Zum Beispiel in Linux:
%Vor% Ich nehme an, dass Sie über die Implementierung der system
-Funktion selbst sprechen, im Gegensatz zu allem, was über den Aufruf aufgerufen wird. (Offensichtlich kann ein untergeordneter Prozess die
nicht im Kontext der Eltern aufrufen, und selbst das setzt voraus, dass der Aufruf in Perl-Code erfolgt.)
Eine definitive Antwort würde Wissen über die Interna erfordern, aber da der Versuch, ein nicht existierendes Programm aufzurufen, nicht stirbt, kann ich mir auch nichts anderes vorstellen:
%Vor%