2009-11-10 18 views
4

考虑一个调用exit()作为最后指令的信号处理程序: 可以安全地调用该处理程序中的非可重入函数(例如free())?信号处理程序中的非重入函数?

恕我直言,这将是合法的,因为处理程序不会将 返回到正常的执行顺序。

预先感谢您。

回答

0

重入的更多的是“高考”被比出口上述功能保持功能和副作用和状态......

你可能想咨询这个man page

1

您必须区分两个信号:告诉守护进程“重新载入”和终止守护进程(“终止”)的信号。在“杀”的情况下,你不需要释放任何东西。你的进程将会消失,操作系统会清理你分配的任何东西。如果您使用共享内存,则必须在重新启动时执行清理。不要在可能导致问题的“kill”处理程序中做任何事情。去死吧。

在重载的情况下,您可以调用您喜欢的任何函数,因为用户希望您“有序关闭”。在这种情况下,再次获得相同信号的可能性很小(因此功能是否可重入无关紧要)。

+0

好的,谢谢。 这个项目是考试。我担心离开malloc()没有免费():) – Marco 2009-11-10 12:44:35

+1

不正确。如果信号中断了一些获取锁的代码,然后信号处理程序试图获取相同的锁,则程序将挂起。当一个信号中断free(),然后信号处理函数调用free()时,我看到了这种情况。 – 2011-09-28 02:12:36

+0

@Posco Grubb:有趣的;我如何防止在C?信号SIGHUP可以随时到达。我怎样才能确保我不叫“危险”功能? – 2011-09-28 15:31:08