2012-11-05 16 views
8

Una chiamata system() può mai die in Perl 5?Una chiamata di sistema Perl() può mai morire?

(in altre parole, al fine di 100% incidente a prova di un programma che fa una chiamata system(), Ha bisogno di essere avvolto in un eval blocco, o è che tutto completamente inutile?)


Non ho trovato una sola menzione a questa possibilità in perldoc system, ma non ho trovato la precisa "questa chiamata non muore mai".

NOTA: la domanda riguarda Basic CORE Perl qui, n. autodie o qualsiasi altro modulo personalizzato che avrebbe un effetto simile. Inoltre, non assumere il segnale ALRM o qualsiasi altro gestore di segnale personalizzato.

Suppongo che tutte le versioni di Perl 5. * si comportino allo stesso modo, ma in caso contrario, una risposta pertinente a 5.8 sarebbe apprezzata.

+0

Non sono andato a guardare la fonte, quindi non sto postando questo come risposta, ma sarei sorpreso se non ci fosse modo per 'sistema' di esaurire la memoria. – Gilles

+0

@Gilles - "Memoria insufficiente" causa a Perl l'emissione di un "dado" anziché di coredump/crash? Assumerei il più tardi, ma non lo so, né – DVK

+0

@Gilles - [se solo avessimo un posto dove possiamo porre domande di programmazione ...] (http://stackoverflow.com/questions/13243637/is-there-a-standard -way-per-perl-to-comportarsi-quando-da-run-out-of-memoria). Vediamo cosa scopre la saggezza SO. – DVK

risposta

6

a meno che la mia interpretazione della fonte non è corretta, questo appare come una possibilità:

fonte: Perl 5.16.2 (anche controllato 5.8.8), file: pp_sys.c, riga: 4224 all'interno del blocco di codice PP(pp_system):

if (n != sizeof(int)) 
    DIE(aTHX_ "panic: kid popen errno read, n=%u", n); 

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

Secondo la documentazione, "panico: kid popen errno leggere" significa "figlio biforcuta restituito un messaggio incomprensibile circa la sua errno".

Explanation of panic messages in Perl:

La convenzione è che quando l'interprete muore con un errore interno , il messaggio inizia "panico:".Storicamente, molti messaggi di panico erano stringhe terse fisse, il che significa che i valori fuori intervallo che hanno provocato il panico sono persi. Ora proviamo a riportare questi valori, in quanto tali messaggi potrebbero non essere ripetibili e il messaggio di errore originale potrebbe essere l'unica diagnostica che otteniamo quando proviamo a trovare la causa.

+0

dalla mia lettura dell'origine ciò avverrà solo se 1) l'exec() eseguito dal figlio fallisce e 2) il bambino non è in grado di inviare 4 (forse 8) byte al genitore tramite la pipe. – ErikR

0

system restituisce lo stato di uscita del programma. Significa che se il programma si blocca, lo script Perl chiamante continua (vedere system).

Tuttavia, il programma stesso può ancora terminare lo script chiamante o addirittura causare il crash del computer. Per esempio, in Linux:

system 'killall', 'perl'; 
print "Alive\n"; 
+0

Per favore, vedi il mio commento a Brian Agnew. Questo non è quello che stavo chiedendo. – DVK

1

È possibile chiamare system() con l'aspettativa che non sarà un'eccezione. Non è necessario avvolgerlo in un blocco eval.

+0

"con l'aspettativa" - esiste una base tecnica per questo? Se guardi la risposta di j.w.r., la tua affermazione sembra totalmente sbagliata. – DVK

+0

Sarei interessato a vedere quanti moduli CPAN cercano di catturare un'eccezione generata da 'system'. Il punto non è che non può accadere, ma piuttosto che puoi usare 'system()' con l'aspettativa che non genererà un'eccezione. – ErikR

0

Presumo che si stia parlando dell'implementazione della funzione system anziché di quella invocata tramite la chiamata. (Ovviamente, un processo figlio non può chiamare die nel contesto del genitore, e anche questo presuppone che la chiamata sia sul codice Perl.)

Una risposta definitiva richiederebbe la conoscenza degli interni, ma dato che il tentativo di invocare un non programma -existent non muore, non posso immaginare che qualsiasi altra cosa mai avrebbe fatto, o:

system('abcd');  # 'abcd' is not recognized... [Win32 message] 
say "I'm not dead."; # always prints 
+0

"Suppongo che tu stia parlando dell'implementazione della funzione di sistema stessa rispetto a qualsiasi cosa venga invocata tramite la chiamata." - correggi – DVK