我有一个用C写的控制硬件设备的小库。库使用pthreads——它启动一个负责与硬件设备交互的线程。
在某些用例中(但并非总是),这个小库可以从Java应用程序(vía JNI)中使用。当Java应用程序调用System.exit()
时,所有线程都被终止,库没有机会确保硬件设备处于"空闲"状态;状态。
库是否可以设置一个在主程序退出或线程终止时调用的清理函数?在概念上类似于atexit
(但我知道atexit不应该从共享库中调用)。
我不太了解JNI,但我猜你的共享库只是在某些时候加载,使用dlopen
或类似于windows。
gcc和clang有__attribute__((destructor))
(和constructor
)。
您可以使用它来进行清理和初始化。
在windows上,您可以使用DllMain
并检查DLL_PROCESS_ATTACH
或DLL_PROCESS_DETACH
原因。
它应该在调用库的最后一个dlclose
之后调用。
不要使用打印输出来调试它,因为此时,stdout
可能已经关闭。
__attribute__((destructor)) void myCleanupFn(){
// Cleanup :-)
}