Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用户无法在Linux系统上打开共享内存对象的原因_C++_Linux_Boost_Shared Memory_Permission Denied - Fatal编程技术网

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

C++ 用户无法在Linux系统上打开共享内存对象的原因,c++,linux,boost,shared-memory,permission-denied,C++,Linux,Boost,Shared Memory,Permission Denied,我在支持的一个应用程序中遇到了一些问题,由于各种恼人的原因,它分叉工作进程来处理一些任务。这些进程使用共享内存空间来传递状态,有时还传递结果。我使用boost进程间库来实现这一点(使用共享内存对象和映射区域类型) 在部署到的其中一个系统上,我们的访问权限非常有限,这使得在该系统上调试非常困难。安装新版本的软件需要一个完整的过程。但是在这个目标上,我们遇到了这样一个问题:一个试图启动应用程序的用户能够很好地启动应用程序,而另一个用户(具有看似相同的凭据、组从属关系等)无法创建共享内存对象。boos

我在支持的一个应用程序中遇到了一些问题,由于各种恼人的原因,它分叉工作进程来处理一些任务。这些进程使用共享内存空间来传递状态,有时还传递结果。我使用boost进程间库来实现这一点(使用共享内存对象和映射区域类型)

在部署到的其中一个系统上,我们的访问权限非常有限,这使得在该系统上调试非常困难。安装新版本的软件需要一个完整的过程。但是在这个目标上,我们遇到了这样一个问题:一个试图启动应用程序的用户能够很好地启动应用程序,而另一个用户(具有看似相同的凭据、组从属关系等)无法创建共享内存对象。boost错误为“权限被拒绝”。对于创建共享内存对象的任何尝试,即使该名称不存在,也会返回该值

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

那么我的问题是,还有什么其他原因可能会阻止一个用户打开共享内存对象?我只提到了根/非根限制,但我找不到任何其他可能的解释

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

检查

  • /dev/shm权限(在/dev/direntry上也是+x)
  • librt.so的可用性/可访问性
  • 有效的
  • 初级组和次级组的
    id
    输出
  • SELinux配置(getenforce,setenforce 0)
  • AppArmor(不太可能是这种系统的罪魁祸首,但仍然如此)

此外,并非所有内核都编译了SHM支持,但这似乎不是这里的问题。

perror()
实际上说明了什么?在我更新远程系统上的软件之前,我无法回答这个问题,不幸的是,这需要与他们的系统管理员进行一些交互。不幸的是,这个失败模式没有得到正确的处理,所以我唯一的输出就是断言抛出的boost错误消息。我可能可以排除大多数这种情况(ulimit除外,我不熟悉它,需要进行研究)因为其他用户可以使用与无法执行操作的用户相同的组和权限来执行操作。在这种情况下,我不认为SELinux或AppArmor正在使用。关键是要再次检查这些。显然我不是说我知道你的系统出了什么问题。但请检查“我不知道,它正在使用”: