2016-04-29 10 views
7

Sto scrivendo un programma di spazio utente che interagisce con il controller di riproduzione video USB. Sto programmando in C++ e il programma è progettato per funzionare su Linux. Durante lo studio del manuale di libusb mi sono imbattuto nella funzione void libusb_exit (struct libusb_context * ctx).Quali sono le conseguenze di non chiamare libusb_exit()

La descrizione says:

Deinitialize libusb.

Dovrebbe essere chiamato dopo aver chiuso tutti i dispositivi aperti e prima che l'applicazione termini.

Il manuale non spiega perché è necessario. Sono diventato curioso delle conseguenze della chiusura di un programma che aveva inizializzato e utilizzato libusb senza chiamare libusb_exit(). Qualcuno può spiegare cosa potrebbero accadere cose brutte se per qualche ragione il mio programma non riuscirà a chiamare libusb_exit() prima di terminare? Causerà la perdita di risorse di sistema?

risposta

3

È qualcosa che coinvolge i contesti .

Se si dispone di un'applicazione per utente singolo, in genere si utilizza il contesto predefinito. Quello muore ogni volta che la sessione dell'utente viene distrutta, probabilmente è quando l'applicazione deve essere chiusa.
Nota anche che non puoi perdere semplicemente perché non chiami libusb_exit se l'app si blocca (beh, anche se è possibile una perdita, la memoria trapelata verrà rilasciata immediatamente dopo l'arresto, quindi non mi interessa su questo più che sulla ragione del crash stesso).

Il problema si presenta ogni volta che si hanno più sessioni.
Vedere here e here per ulteriori dettagli.
Se non si riesce a chiamare libusb_exit in questo caso e la sessione è in uno stato rilasciato dal punto di vista dell'applicazione, si sta per perdere memoria, poiché il contesto non verrà effettivamente distrutto da libusb. Infatti, in questo caso il software non deve essere chiuso, ma quella memoria è ancora in uso e non è più raggiungibile, perché non hai invocato lo libusb_exit per rilasciarlo.

Ecco perché la documentazione suggerisce di chiamare libusb_exit ogni volta che si desidera distruggere un contesto, quello predefinito o no.

+0

Penso che tu abbia frainteso (o non riesci ad affrontare) la domanda. IIUC sta chiedendo perché sarebbe necessario chiamare 'libusb_exit' prima di terminare il processo (di nuovo, IIUC, in realtà non è necessario). La tua menzione di _crashes_ è confusa. In che modo la libreria riesce a gestire i contesti in modo diverso se l'applicazione _crashes_ è comparata all'uscita pulita? – davmac

Problemi correlati