Kann ein Perl system () Aufruf jemals sterben?

8

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.

    
DVK 05.11.2012, 15:10
quelle

4 Antworten

6

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:

%Vor%

DIE ist Perl_die(pTHX_ const* pat, ...) in util.c

deklariert

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.

    
j.w.r 05.11.2012, 17:12
quelle
1

Sie können system() mit der Erwartung aufrufen, dass keine Ausnahme ausgelöst wird. Sie müssen es nicht in einen eval -Block einbinden.

    
ErikR 05.11.2012 15:50
quelle
0

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%     
choroba 05.11.2012 15:42
quelle
0

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%     
Michael Carman 05.11.2012 16:05
quelle

Tags und Links