2016-04-29 13 views
7

Piszę program przestrzeni użytkownika, który współdziała z kontrolerem odtwarzania wideo USB. Programuję w C++, a program ma działać na Linuksie. Podczas studiowania podręcznika libusb natknąłem się na funkcję void libusb_exit (struct libusb_context * ctx).Jakie są konsekwencje nie wywoływania libusb_exit()

Opis says:

Deinitialize libusb.

Powinien zostać wywołany po zamknięciu wszystkich otwartych urządzeń i przed zamknięciem aplikacji .

Instrukcja nie wyjaśnia, dlaczego jest potrzebna. Byłem ciekawy konsekwencji zakończenia programu, który zainicjował i użył libusb bez wywoływania libusb_exit(). Czy ktoś może wyjaśnić, co może się stać złymi rzeczami, jeśli z jakiegoś powodu mój program nie zadzwoni pod numer libusb_exit() przed zakończeniem? Czy spowoduje to wyciek zasobów systemowych?

Odpowiedz

3

Jest to coś, co wymaga kontekstów .

Jeśli chodzi o pojedynczą aplikację użytkownika, zwykle używasz domyślnego kontekstu. Ten umiera za każdym razem, gdy sesja użytkownika zostanie zniszczona, prawdopodobnie wtedy, gdy twoja aplikacja ma zostać zamknięta.
Uwaga: nie można przeciekać tylko dlatego, że nie zadzwonisz pod numer libusb_exit, jeśli twoja aplikacja ulegnie awarii (cóż, nawet jeśli wyciek jest możliwy, wyciekowana pamięć zostanie zwolniona natychmiast po awarii, więc nie obchodzi mnie to o tym więcej niż o przyczynie samej katastrofy).

Problem pojawia się, gdy masz wiele sesji.
Aby uzyskać więcej informacji, zobacz numery here i here.
Jeśli w takim przypadku nie zadzwonisz pod numer libusb_exit, a sesja jest w stanie wydana z punktu widzenia aplikacji, na pewno stracisz pamięć, ponieważ kontekst nie zostanie faktycznie zniszczony przez libusb. W rzeczywistości w tym przypadku oprogramowania nie można zamknąć, ale pamięć jest nadal używana i nie jest już dostępna, ponieważ użytkownik nie wywołał jej, aby wywołać libusb_exit.

Dlatego dokumentacja sugeruje wywołanie libusb_exit za każdym razem, gdy chcesz zniszczyć kontekst, domyślny lub nie.

+0

Myślę, że źle rozumiesz (lub nie odpowiadasz) pytanie. IIUC pyta, dlaczego konieczne byłoby wywołanie 'libusb_exit' przed zakończeniem procesu (ponownie, IIUC, w rzeczywistości nie jest to konieczne). Twoja wzmianka o _crashes_ jest myląca. W jaki sposób biblioteka radzi sobie z kontekstami w inny sposób, jeśli aplikacja "ściąga" w porównaniu do czystego wychodzenia? – davmac

Powiązane problemy