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