我在客户端-服务器模型中使用共享内存。 当我的服务器被用户使用 sigkill 而不是 sigterm/sigint 杀死时,我对此无能为力(如预期的那样),但我的共享内存对象和信号量仍然存在于/dev/shm/中。
下次我启动我的服务器时,我想创建一个名称完全相同的新对象,并且 - 正如预期的那样 - 这失败了,我退出了我的程序。
用户需要自己删除对象 - 这当然不是最好的选择。
我该如何处理?
我可以在没有 O_EXCL 标志的情况下调用 shm_open(),最终破坏了这个标志的目的。因为也许我的服务器实例已经在运行并使用了这个对象。
Pulseaudio 似乎使用数字组合来保持它的对象不同,并且不会因用 -9 杀死它而受到影响,所以似乎有办法。
最佳答案
一种选择是使用 IPC_RMID
(参见 this)。
此选项标记 shm
段,以便在附加到它的最后一个进程消失后进行清理。
信号量可以看robust mutexes .它确实需要您为额外的错误情况编写代码(当持有互斥锁的进程终止时)。
您还可以选择使用文件锁,如果进程终止,文件锁将被释放(参见 lockf() )。
关于c - 使用共享内存时如何处理被杀(kill -9)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708749/