提升进程间,第二进程无法打开第一进程创建的共享内存

时间:2015-08-19 11:01:32

标签: c++ boost shared-memory

我正在编写一个Windows应用程序,它需要在多个实例(进程)之间共享一些日期。我选择使用boost interprocess。经过一番调查,我发现managed_windows_shared_memory最适合我的情况。但是第二个进程无法打开第一个进程创建的共享内存。

第一个实例代码:

#include <boost/interprocess/managed_windows_shared_memory.hpp>
using namespace boost::interprocess;
typedef boost::interprocess::managed_windows_shared_memory SharedMemory;

SharedMemory sharedMemory(create_only, "MyTestSharedMemory", 65535);

第二个实例代码:

#include <boost/interprocess/managed_windows_shared_memory.hpp>
using namespace boost::interprocess;
typedef boost::interprocess::managed_windows_shared_memory SharedMemory;

try
{
    SharedMemory sharedMemoryT(open_only, "MyTestSharedMemory");
}
catch (interprocess_exception &ipce)
{
    if (ipce.get_error_code() == not_found_error)
    {
        ::OutputDebugStringA("Not found");
    }
}

我确定当第二个实例尝试打开共享内存时,第一个实例进程仍在运行(未退出)。

通过运行accesschk.exe,我确定创建了共享内存系统对象,并在第二个实例尝试打开它时仍然存在。以下是有关此共享内存的输出。在这里&#34; my-domain&#34;,&#34; my-account&#34;和&#34; my-domain-account&#34;在我的环境中有实际价值。

\Sessions\5\BaseNamedObjects\MyTestSharedMemory
  Type: Section
  Medium Mandatory Level (Default) [No-Write-Up]
  RW NT AUTHORITY\SYSTEM
    SECTION_ALL_ACCESS
  RW my-domain\my-account
    SECTION_ALL_ACCESS
  RW my-domain\my-domain-account
    SECTION_ALL_ACCESS

每次,第二个实例获得&#34; not_found_error&#34;。如果我首先尝试创建共享内存然后尝试在同一个实例中打开它,那么它就会成功。任何的想法?我在Windows 8.1上。

更多信息。 这两个实例在具有相同用户帐户的同一会话中运行。

我尝试在第一个实例中使用Windows API CreateFileMapping,在第二个实例中使用OpenFileMapping,它运行良好!

我还尝试使用boost managed_shared_memory而不是managed_windows_shared_memory,它也有效。

然后我尝试使用boost windows_shared_memory,第一个实例创建成功,但第二个实例无法找到它。

看起来在boost本机Windows共享内存类中存在一些问题(managed_windows_shared_memory / windows_shared_memory)。

1 个答案:

答案 0 :(得分:0)

我最好的选择是你没有在与创建共享内存区域的“服务器”进程相同的会话中运行(注意\Sessions\5命名空间前缀)。

这通常发生在一个进程作为服务运行或以其他方式冒充其他帐户时(想想ASP / IIS工作者,Citrix /终端服务器会话等)。