共享内存段被删除?

时间:2018-04-23 10:53:46

标签: c linux pthreads shared-memory mmap

我在共享内存段中使用一个简单的pthreads进程共享互斥锁来协调多个服务器实例。

代码很简单:
在启动服务器上,如果存在则附加到共享内存段,或者如果不存在则创建它: shm_open()mmap(MAP_SHARED)等。

这在测试时非常有效,但是一段时间后我就遇到了服务器实例根本没有协调的情况。我可以通过在服务器启动后删除共享内存段来复制这个:未来的服务器实例将创建/使用一个新的段但是现有的一个段卡住了没有人使用的旧段,所以实际上它与其余段隔离了...... / p>

所以我的猜测是/ dev / shm中的共享内存段以某种方式被删除,而不是我。这是唯一有意义的事情......这里发生了什么?

使用linux 4.9运行debian。

1 个答案:

答案 0 :(得分:3)

啊,看起来像systemd是罪魁祸首:

来自dev-shm-files-disappearing

  

经过几个小时的搜索和阅读,我找到了罪魁祸首。这是systemd的设置。 /etc/systemd/logind.conf包含默认配置选项,每个选项都已注释掉。默认情况下,RemoveIPC选项设置为yes。该选项告诉systemd清理未登录的“用户帐户”的进程间通信(IPC)。这不会影响“系统帐户”

     

就我而言,正在为用户帐户而不是系统帐户创建文件和目录。

     

有两种可能的解决方案:

     
      
  1. 使用/为系统用户创建文件 - 使用系统选项(adduser -radduser --system创建的用户)
  2.   
  3. 修改/etc/systemd/logind.conf,取消注释第RemoveIPC=yes行,将其更改为RemoveIPC=no,保存并重启系统
  4.         

    在我的情况下,我使用选项#2,因为用户已经创建。

另请参阅postgresql邮件列表中的this post