如何在SIGKILL之后进行清理?

fel*_*ace 9 c linux signals

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

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

有没有办法指定即使在SIGKILL信号之后该做什么?我可能会写一些类似于计时器的机制来检查进程是否还活着,但是如果有另一种方法,我真的想避免使用它.

小智 17

不,SIGKILL不能被您的应用程序以任何方式捕获 - 如果可以,应用程序可以忽略它,这将失败其目的.


Dav*_*ven 14

你无法抓住SIGKILL.

但是:如果清理由另一个进程完成,您仍然可以进行清理.你可以在这里采取许多策略让你的内务处理过程看到你的其他过程出现和消失.

例如:你可以在已知位置安装一个Unix域套接字,管家可以监听; 每个从属进程打开套接字以指示它正在使用共享内存段.当从属设备退出时,无论出于何种原因,套接字将被关闭.管家可以看到这种情况发生并可以进行清理.