【问题标题】:boost interprocess, 2nd process can't open the shared memory created by 1st process提升进程间,第二个进程无法打开第一个进程创建的共享内存
【发布时间】:2015-08-19 11:01:32
【问题描述】:

我正在编写一个 Windows 应用程序,它需要在多个实例(进程)之间共享一些日期。我选择使用 boost 进程间。经过一番调查,我发现 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,我确定共享内存系统对象已创建并且在第二个实例尝试打开它时仍然退出。这是有关此共享内存的输出。这里的“my-domain”、“my-account”和“my-domain-account”在我的环境中有实际值。

\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

每次,第二个实例都会收到“not_found_error”。如果我尝试先创建共享内存,然后尝试在同一实例中打开它,它会成功。任何想法?我在 Windows 8.1 上。

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

我尝试在第一个实例中使用 Windows API CreateFileMapping,在第二个实例中使用 OpenFileMapping,效果很好!

我也尝试使用 boost managed_shared_memory 代替 managed_windows_shared_memory,它也可以。

然后我尝试使用boost windows_shared_memory,1st instance创建成功,但是2nd instance找不到。

似乎在 boost 本机 windows 共享内存类 (managed_windows_shared_memory/windows_shared_memory) 中存在一些问题。

【问题讨论】:

    标签: c++ boost shared-memory


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的 cmets。但是这两个实例使用相同的用户帐户在同一个会话中运行。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多