【问题标题】:non-reentrant function in signal handler?信号处理程序中的不可重入函数?
【发布时间】:2009-11-10 11:21:22
【问题描述】:

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

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

提前谢谢你。

【问题讨论】:

    标签: handler signals


    【解决方案1】:

    不,这是非法的,此外,可以调用的安全函数很少。

    有一个可以调用的安全函数列表,请参阅http://linux.die.net/man/2/signal 注释部分。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好的,谢谢。这个项目是为了考试。我担心在没有 free() 的情况下留下 malloc() :)
      • 不正确。如果信号中断了某些获取锁的代码,然后信号处理程序尝试获取相同的锁,您的程序将挂起。当信号中断 free() 然后信号处理程序调用 free() 时,我看到这种情况发生过一次。
      • @Posco Grubb:有趣;如何在 C 中防止这种情况? SIGHUP 信号可以随时到达。如何确保不调用“危险”函数?
      • @Aaron:您无法阻止信号中断不可重入函数。但是您可以确保您的信号处理程序不调用不可重入函数。 chemie.fu-berlin.de/chemnet/use/info/libc/libc_toc.html#TOC360
      • 对于 SIGHUP,我强烈推荐某种事件循环。当您收到信号时,您将其标记在某处,一旦离开信号处理程序,您就会不时检查该掩码。
      【解决方案3】:

      重入更多地与函数的“入口”有关,以及由所述函数维护的副作用和状态,而不是退出......

      您可能想咨询这个man page

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-30
        • 2013-06-19
        相关资源
        最近更新 更多