Domanda

Naturalmente, la risposta immediata per la maggior parte delle situazioni è " yes " , e sono fermamente convinto che un processo dovrebbe ripulire correttamente tutte le risorse che ha allocato, ma quello che ho nella mia situazione è un demone di sistema di lunga durata che apre un numero fisso di descrittori di file all'avvio e li chiude tutti prima di uscire.

Questa è una piattaforma integrata e sto cercando di rendere il codice il più compatto possibile, senza introdurre alcun cattivo stile. Ma poiché i descrittori di file vengono comunque chiusi prima dell'uscita, questo codice di pulizia del descrittore di file ha qualche scopo? Chiudi sempre tutti i descrittori di file?

È stato utile?

Soluzione

La chiusura dei descrittori di file al termine dell'utilizzo rende il codice più riutilizzabile e più facile da estendere. Questo mi sembra un caso in cui hai un motivo valido per lasciarli chiudere automaticamente.

Altri suggerimenti

Sì, chiudi i descrittori di file e libera tutta la memoria heap, anche se sai che il sistema operativo lo pulirà - in questo modo, quando esegui valgrind o uno strumento simile, non ottieni molto rumore nel risultati e puoi facilmente riconoscere " legit " fd perdite.

Nel meraviglioso mondo della piattaforma integrata, è davvero difficile dire cosa succederebbe. Tuttavia, se mi trovassi nella tua situazione, farei manualmente un test per vedere se l'ID del file è davvero rilasciato .. E, se lo spazio è così importante, forse potresti documentare questo fatto altrove.

L'unica preoccupazione che avrei riguardo al lasciare la chiusura dei descrittori di file per la pulizia automatica, sarebbe quanto ti preoccupi dei dati che hai scritto su tali descrittori di file e se riesci ragionevolmente a gestire un errore scrivere.

write () non ha bisogno di bloccare (a seconda di come erano open () ed in primo luogo) e attendere che i dati si impegnino correttamente, quindi ci sono casi in cui la chiusura può fallire perché il sottosistema sottostante non riesce a eseguire il commit del in attesa di scrittura, quindi chiudi le uscite con errori e imposta errno su EIO e, a seconda di ciò che hai appena scritto, potresti o meno voler intraprendere alcune azioni correttive.

Certamente, questo è un caso angolare in cui ci si preoccupa VERAMENTE della coerenza dei dati, vale a dire di applicazioni di tipo DBMS o di report sull'esito positivo / negativo di un backup. Nella maggior parte dei casi (la maggior parte?) Non importa molto, e starai bene a chiudere close () per elaborare cleanup / exit.

uscita man 3:

....
All open stdio(3) streams are flushed and closed.  Files created by tmpfile(3) are removed.

Quindi credo che lasciare main chiama in modo efficace la funzione di uscita con il valore di ritorno di main. Anche se direi che è un cattivo stile. Personalmente, sempre esplicitamente libero / chiudo qualsiasi risorsa acquisita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top