用户可能无法在 Linux 系统上打开共享内存对象的原因
Reasons a user might not be able to open a shared memory object on Linux systems
我在支持的应用程序上遇到了一些问题,出于各种烦人的原因,我分叉了工作进程来处理某些任务。这些进程使用共享内存空间传达状态,有时还传达结果。我正在使用提升进程间库来实现这一点(使用 shared_memory_object 和 mapped_region 类型)。
在部署到的其中一个系统上,我们的访问权限非常有限,这使得在该系统上进行调试变得困难。有一个完整的过程只是为了安装新版本的软件。但是在这个目标上,我们遇到了一个问题,即一个用户尝试启动应用程序,能够很好地做到这一点,而另一个具有看似相同的凭据、组隶属关系等的用户无法创建共享内存对象。提升错误是"权限被拒绝"。对于创建共享内存对象的任何尝试,即使该名称尚不存在,也会返回此值。
我只能通过以 root 身份启动应用程序来重现此问题,因此使用受限权限创建内存空间,然后以非 root 用户身份重新运行,这会产生相同的权限问题。我能够通过调用权限对象上的 set_unrestricted 例程来解决此问题,如此处所述。但是,这不是此远程系统上发生的情况,因为两个用户都不是root,并且一个用户无法创建任何命名的内存对象,即使是新的对象。
那么我的问题是,还有哪些其他原因可能会阻止一个用户打开共享内存对象?我只找到了对根/非根限制的提及,但我无法找到任何其他可能的解释。
这是使用 boost 1.55 进程间库在 Linux 系统上创建共享内存对象。
检查
- /
- dev/shm 权限(在/dev/direntry 上也为 +x)
librt.so
的可用性/可访问
性- 限制生效
- 主要组和辅助组的
id
输出 - SELinux configuration (getenforce, setenforcement 0)
- AppArmor(不太可能是这种系统的罪魁祸首,但仍然如此)
此外,并非所有内核都编译了 SHM 支持,但这似乎不是这里的问题。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- Directx 12 :在两个进程之间共享图形内存
- 有没有办法列出所有共享内存对象的名称?
- 子进程更新共享 mmap 内存,但父进程没有更改
- C++线程之间的内存共享
- 使用Windows共享内存共享小数据
- 更有效地使用fork()和写时复制内存共享
- 从托管代码到非托管代码跨共享内存共享整数数组
- 通过内存共享c++对象
- 内存共享;继承;基实例和派生实例;c++
- Matlab与c++在MEX中的内存共享
- 跨共享内存共享 std::字符串