提振间,第二个过程中不能打开由第一进程创建的共享内存(boost interprocess, 2nd

2019-11-04 00:22发布

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

规范第1实例:

#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");
    }
}

我敢肯定,当第二个实例试图打开共享内存,1实例进程仍在运行(不退出)。

通过运行accesschk.exe,我敢肯定,在创建共享内存系统对象,当第二个实例试图打开它仍然退出。 下面是关于该共享存储器的输出。 这里的“我的域”,“我的账户”和“我的域帐户”在我的环境中的实际值。

\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。

更多信息。 这两种情况下,在同一个用户帐户相同的会话中运行。

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

我也试过,而不是使用managed_windows_shared_memory升压managed_shared_memory,它也适用。

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

貌似在共享内存类(managed_windows_shared_memory / windows_shared_memory)升压原生Windows的一些问题。

Answer 1:

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

这当一个进程作为服务运行或以其他方式冒充不同的帐户通常发生(ASP思考/ IIS工人,Citrix /终端服务器会话等)



文章来源: boost interprocess, 2nd process can't open the shared memory created by 1st process