2013-01-02 23 views
9

Se sto scrivendo uno script Perl che sovrascrive STDERR con un duplicato di STDOUT ma non ripristino mai il filehandle, cosa succede alla fine dell'esecuzione dello script? Non riesco a trovare nulla che mette in guardia contro ciò che effettivamente si verifica o non si verifica.Cosa succede se non chiudi un filehandle in Perl?

Sono probabilmente disinformato ma grazie per la vostra pazienza.

risposta

12

All'uscita di un processo, il kernel recupera tutte le risorse utilizzate. Questo include tutti i descrittori di file, che sono semplicemente chiusi. Se esiste un buffer a livello di applicazione, i dati nel buffer potrebbero non essere stati scritti nel kernel, ma altrimenti non vi è alcun rischio nel mantenere i descrittori di file aperti prima di uscire.

Se lo script Perl termina utilizzando exec per avviare un altro processo, tale processo erediterà tutti i descrittori di file (ad eccezione di quelli contrassegnati come close su exec).

+2

Inoltre, perl normalmente si occuperà di svuotare i propri buffer in base alle necessità, a meno che non si faccia qualcosa di sciocco come "kill 9, $$". Anche se sembra che ci siano alcuni [problemi rimanenti con quello] (http://perldoc.perl.org/perlport.html#exec) su alcune piattaforme. –