如何在SIGKILL之后进行清理?

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

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

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

不,SIGKILL不能以任何方式被你的应用程序捕获 – 如果可能的话,应用程序可以忽略它,这将会失败它的目的。

你不能赶上SIGKILL。

但是:如果清理是由另一个进程完成的,您仍然可以进行清理。 有很多策略,你可以在这里让你的看家过程看到你的其他过程出现和消失。

例如:你可以在管家监听的已知位置有一个Unix域套接字。 每个从属进程打开套接字以指示使用共享内存段。 当一个奴隶退出,无论出于何种原因,套接字将被关闭。 管家可以看到发生这种情况,可以做清理。

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