c - 使用共享内存时如何处理被杀(kill -9)?

标签 c posix shared-memory sigkill

我在客户端-服务器模型中使用共享内存。 当我的服务器被用户使用 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/

相关文章:

windows - 32 位应用程序在 64 位 Windows 中的行为(内存)

c - C 开发人员需要学习的具有 UI 的编程语言

c - C中的字符串解析

Bash 在循环中设置一个全局变量并保留它的值——或者进程替换为假人

共享内存中的 C 结构成员指针 (mmap)

C# 共享内存 - CPU 缓存的风险(非 volatile 读取)?

c - 如何在 C/C++ 中等待子进程直到达到 CPU 时间超时?

c - 在 C 中使用 malloc 的字符串

c - 所有 POSIX/SUS 信号都是 #define 是给定的还是假设的?

linux - 就地编辑文件