C SIGKILL之后如何进行清理?

C SIGKILL之后如何进行清理?,c,linux,signals,C,Linux,Signals,我正在开发一个使用共享内存的程序。所述程序的多个实例要么连接到现有的实例,要么重新创建它,并在没有其他进程时将其返回给操作系统,要么将其分离并终止。我想用一个简单的计数器来记录有多少进程使用它 我正在使用atexit()函数进行清理,但是,在收到SIGKILL信号后,进程将不会进行任何清理,因此如果这些进程中的任何一个不能正常终止,我可能永远无法清理内存 有没有办法指定在发出SIGKILL信号后要做什么?我可能会编写一些类似于计时器的机制来检查进程是否仍处于活动状态,但如果有其他方法,我真的希望

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

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


有没有办法指定在发出SIGKILL信号后要做什么?我可能会编写一些类似于计时器的机制来检查进程是否仍处于活动状态,但如果有其他方法,我真的希望避免它。

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

您无法捕获SIGKILL

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


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

与共享内存相结合,位于共享内存段的健壮互斥体将是一个很好的工具。如果一个进程在一个健壮的互斥锁上持有锁时死亡,那么下一个试图锁定它的进程将获得
eownerded
,并可以执行原始所有者应该执行的清理