2016-04-29 7 views
7

Ich schreibe ein Userspace-Programm, das mit dem USB-Video-Playback-Controller interagiert. Ich programmiere in C++ und das Programm soll unter Linux laufen. Während ich das libusb Handbuch studierte, stieß ich auf die void libusb_exit (struct libusb_context * ctx) Funktion.Was sind die Konsequenzen von nicht aufrufen libusb_exit()

Die Beschreibung says:

Deinitialize libusb.

Sollte nach dem Schließen aller geöffneten Geräte aufgerufen werden und bevor Ihre Anwendung beendet wird.

Das Handbuch erklärt nicht, warum es benötigt wird. Ich wurde neugierig auf die Konsequenzen der Beendigung eines Programms, das libusb initialisiert und verwendet hatte, ohne libusb_exit() zu rufen. Kann jemand erklären, was schlimme Dinge passieren können, wenn mein Programm aus irgendwelchen Gründen libusb_exit() vor dem Beenden nicht aufrufen kann? Werden Systemressourcen auslaufen?

Antwort

3

Es ist etwas, das Kontexte beinhaltet.

Soweit Sie eine Einzelbenutzeranwendung haben, verwenden Sie normalerweise den Standardkontext. Dieser stirbt jedes Mal, wenn die Sitzung des Benutzers zerstört wird, also wahrscheinlich, wenn Ihre Anwendung geschlossen wird.
Beachten Sie auch, dass Sie nicht leak einfach, weil Sie libusb_exit nicht aufrufen, wenn Ihre App stürzt (na ja, auch wenn ein Leck möglich ist, wird der ausgelaufene Speicher sofort nach dem Absturz freigegeben werden, so würde es mich nicht kümmern darüber mehr als über den Grund des Absturzes selbst).

Das Problem tritt auf, wenn Sie mehrere Sitzungen haben.
Weitere Informationen finden Sie unter here und here.
Wenn Sie libusb_exit in solch einem Fall nicht aufrufen und die Sitzung in einem freigegeben Zustand aus Sicht Ihrer Anwendung ist, werden Sie sicherlich Speicher verlieren, denn der Kontext wird nicht tatsächlich durch libusb zerstört werden. In diesem Fall soll die Software nicht geschlossen werden, aber der Speicher wird immer noch verwendet und ist nicht mehr erreichbar, da Sie ihn nicht freigegeben haben. libusb_exit

Deshalb schlägt die Dokumentation vor, libusb_exit jedes Mal aufzurufen, wenn Sie einen Kontext zerstören möchten, entweder den Standardkontext oder nicht.

+0

Ich denke, Sie missverstehen (oder nicht ansprechen) die Frage. IIUC fragt, warum es notwendig wäre, 'libusb_exit' zu nennen, bevor der Prozess beendet wird (wiederum, IIUC, das ist eigentlich nicht notwendig). Deine Erwähnung von _crashes_ ist verwirrend. Wie schafft es die Bibliothek, mit den Kontexten anders umzugehen, wenn die Anwendung _crashes_ im Vergleich zum sauberen Beenden? – davmac