考虑一个调用 exit() 作为最后一条指令的信号处理程序:在该处理程序中调用不可重入函数(例如 free())是否安全?
恕我直言,这是合法的,因为处理程序不会返回正常的执行顺序。
先感谢您。
不,这是非法的,此外,调用的安全函数很少。
有一个可以调用的安全函数列表,请参见http://linux.die.net/man/2/signal Notes 部分。
您必须区分两个信号:告诉守护程序“重新加载”的信号和终止守护程序(“kill”)的信号。在“杀死”的情况下,您不需要释放任何东西。你的进程将会死掉,操作系统会清理你分配的任何东西。如果您使用共享内存,则必须在重新启动时进行清理。不要在“kill”处理程序中做任何可能导致问题的事情。去死吧。
在重新加载的情况下,您可以调用您喜欢的任何函数,因为用户希望您“有序关闭”。在这种情况下,您再次获得相同信号的可能性很小(因此函数是否可重入并不重要)。
重入更多地与函数的“入口”有关,以及由所述函数维护的副作用和状态,而不是退出......
您可能需要查阅此手册页。