考虑一个调用exit()作为最后指令的信号处理程序: 可以安全地调用该处理程序中的非可重入函数(例如free())?信号处理程序中的非重入函数?
恕我直言,这将是合法的,因为处理程序不会将 返回到正常的执行顺序。
预先感谢您。
考虑一个调用exit()作为最后指令的信号处理程序: 可以安全地调用该处理程序中的非可重入函数(例如free())?信号处理程序中的非重入函数?
恕我直言,这将是合法的,因为处理程序不会将 返回到正常的执行顺序。
预先感谢您。
不,这是非法的,更重要的是,有很少的安全功能可以调用。
有一个可以调用的安全功能列表,请参见http://linux.die.net/man/2/signal注释部分。
重入的更多的是“高考”被比出口上述功能保持功能和副作用和状态......
你可能想咨询这个man page。
您必须区分两个信号:告诉守护进程“重新载入”和终止守护进程(“终止”)的信号。在“杀”的情况下,你不需要释放任何东西。你的进程将会消失,操作系统会清理你分配的任何东西。如果您使用共享内存,则必须在重新启动时执行清理。不要在可能导致问题的“kill”处理程序中做任何事情。去死吧。
在重载的情况下,您可以调用您喜欢的任何函数,因为用户希望您“有序关闭”。在这种情况下,再次获得相同信号的可能性很小(因此功能是否可重入无关紧要)。
好的,谢谢。 这个项目是考试。我担心离开malloc()没有免费():) – Marco 2009-11-10 12:44:35
不正确。如果信号中断了一些获取锁的代码,然后信号处理程序试图获取相同的锁,则程序将挂起。当一个信号中断free(),然后信号处理函数调用free()时,我看到了这种情况。 – 2011-09-28 02:12:36
@Posco Grubb:有趣的;我如何防止在C?信号SIGHUP可以随时到达。我怎样才能确保我不叫“危险”功能? – 2011-09-28 15:31:08