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

时间:2013-02-13 11:00:38

标签: c++ c linux shared-libraries signals

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

1 个答案:

答案 0 :(得分:4)

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

这样做的原因主要是很多那些未列在那里的功能可能会做一些事情,比如分配内存等需要处理可能与信号处理程序有竞争条件的事情。一个例子是持有一个锁,所以当信号到达当前持有一些属于malloc / dlclose或其他任何锁的线程时,你调用该函数,那么锁已被锁定,但永远不会被解锁,因为线程当前在信号处理程序中,而不是“正常”执行。