为什么不能从信号处理程序调用 dlclose()?

man*_*m-n 1 c c++ linux signals shared-libraries

我编写了一个用户空间应用程序,其中C使用插件库与低级 Linux 内核驱动程序进行交互plugin.so。我使用打开 DLL dlopen()。我有一个信号处理程序,在收到信号dlclose()SIGINT调用。dlclose()代码审查后,我收到了不能从信号处理程序调用的反馈注释。如果是,为什么会这样?

Pla*_*aHH 5

首先,因为dlclose()POSIX 函数列表中没有列出可以在信号处理程序中安全调用的函数。

其原因主要是许多未列出的函数可能会执行诸如分配内存等操作,这些操作需要执行可能与信号处理程序存在竞争条件的操作。一个例子是持有一个锁,因此当信号到达当前持有属于 malloc/dlclose 或其他的某个锁的线程时,并且您调用该函数,则该锁已经被锁定,但永远不会被解锁,因为线程当前位于信号处理程序中,并且未“正常”执行。