我正在编写一个与USB视频播放控制器交互的用户空间程序.我在C编程,该程序旨在在
Linux上运行.在研究libusb手册时,我遇到了void libusb_exit(struct libusb_context * ctx)函数.
描述says:
Deinitialize libusb.
Should be called after closing all open devices and before your
application terminates.
手册没有解释为什么需要它.我对终止已初始化并使用libusb的程序而不调用libusb_exit()的后果感到好奇.如果由于某些原因我的程序在终止之前无法调用libusb_exit(),有人可以解释可能会发生什么坏事吗?它会导致系统资源泄漏吗?
@H_301_13@解决方法
这是涉及背景的事情.
只要您拥有单个用户应用程序,通常最终会使用默认上下文.每当用户的会话被销毁时,那个就会死掉,这可能是你的应用程序被关闭的时候.
另请注意,您不能简单地泄漏,因为如果您的应用程序崩溃,您不会调用libusb_exit(好吧,即使可能发生泄漏,泄漏的内存将在崩溃后立即释放,所以我不会关心它关于崩溃本身的原因).
只要您有多个会话,就会出现问题.
有关详细信息,请参见here和here.
如果在这种情况下调用libusb_exit失败并且会话从应用程序的角度来看处于释放状态,那么肯定会泄漏内存,因为libusb实际上不会破坏上下文.事实上,在这种情况下,软件不会被关闭,但是该内存仍在使用中且无法再访问,因为您没有调用libusb_exit来释放它.
这就是为什么文档建议每次要破坏上下文时调用libusb_exit,无论是否为默认上下文.
@H_301_13@ @H_301_13@