【问题标题】:How to do a cleanup after SIGKILL?SIGKILL 后如何进行清理?
【发布时间】:2010-07-29 08:48:08
【问题描述】:

我正在开发一个使用共享内存的程序。所述程序的多个实例将连接到现有程序或重新创建它,并在没有其他进程时将其返回给操作系统,或者只是将其分离并终止。我想用一个简单的计数器来跟踪有多少进程在使用它。

我正在使用atexit() 函数进行清理,但是,afaik 在收到 SIGKILL 信号后,进程不会进行任何清理,所以如果这些进程中的任何一个没有正常终止,我可能永远无法清理内存。

有没有办法指定在 SIGKILL 信号之后要做什么?我可能会编写一些类似于计时器的机制来检查进程是否仍然存在,但如果有其他方法,我真的很想避免它。

【问题讨论】:

    标签: c linux signals


    【解决方案1】:

    不,您的应用程序不能以任何方式捕获 SIGKILL - 如果可以,应用程序可能会忽略它,这会破坏其目的。

    【讨论】:

      【解决方案2】:

      你无法捕捉到 SIGKILL。

      但是:您可以仍然进行清理,前提是清理由另一个进程完成。您可以在这里使用很多策略,让您的管家流程看到您的其他流程出现和消失。

      例如:您可以在已知位置拥有一个 Unix 域套接字,管家会监听该套接字;每个从属进程打开套接字以指示它正在使用共享内存段。当从站退出时,无论出于何种原因,套接字都会关闭。管家可以看到这种情况并可以进行清理。

      【讨论】:

        【解决方案3】:

        结合共享内存,位于共享内存段的强大的互斥锁将是一个很好的工具。如果一个进程在持有健壮互斥锁时死亡,下一个尝试锁定它的进程将获得EOWNERDEAD,并且可以执行原所有者应该执行的清理操作。

        【讨论】:

          猜你喜欢
          • 2015-11-24
          • 1970-01-01
          • 2020-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多