用户可能无法在Linux系统上打开共享内存对象的原因

时间:2015-06-15 16:51:54

标签: c++ linux boost shared-memory permission-denied

我遇到了一些我支持的应用程序的问题,出于各种恼人的原因,请求工作进程处理某些任务。这些进程使用共享内存空间来传达状态,有时会产生结果。我正在使用boost进程库来完成此任务(使用shared_memory_object和mapped_region类型)。

在部署的其中一个系统上,我们的访问权限非常有限,因此难以在该系统上进行调试。只需要安装新版本的软件就有一个完整的过程。但是在这个目标上,我们遇到的问题是,一个尝试启动应用程序的用户能够这样做,而另一个用户看似相同的凭据,组关联等,无法创建共享内存对象。提升错误是“权限被拒绝”。对于任何创建共享内存对象的尝试都会返回此值,即使该名称尚不存在。

我只能通过以root身份启动应用程序来重现此问题,因此使用受限制的权限创建内存空间,然后以非root用户身份重新运行,这会产生相同的权限问题。我可以通过调用权限对象上的set_unrestricted例程来解决这个问题here。然而,这不是在这个远程系统上发生的事情,因为用户都不是root用户,一个用户不能创建任何命名的内存对象,甚至是新的。

我的问题是,其他原因可能阻止一个用户打开共享内存对象?我只是提到了root / non-root限制,但我找不到任何其他可能的解释。

这是使用boost 1.55进程间库在Linux系统上创建共享内存对象。

1 个答案:

答案 0 :(得分:2)

检查

  • / dev / shm权限(也是/ dev / direntry上的+ x)
  • librt.so
  • 的可用性/可访问性
  • ulimit实际上
  • 主要和次要群组的id输出
  • SELinux配置(getenforce,setenforce 0)
  • AppArmor(不太可能是这样一个系统的罪魁祸首,但仍然)

此外,并非所有内核都编译了SHM支持,但这似乎不会立即成为问题。