2014-08-29 72 views
5

我可以看到如何做到这一点的唯一方法是尝试访问它并捕获如果它不存在的异常。有没有更好的方法来检查boost共享内存段的存在?

bool exists() 
{ 
    using namespace boost::interprocess; 
    try 
    { 
     managed_shared_memory segment(open_only, kSharedMemorySegmentName); 
     return segment.check_sanity(); 
    } 
    catch (const std::exception &ex) { 
     std::cout << "managed_shared_memory ex: " << ex.what(); 
    } 
    return false; 
} 

有没有更好的方法?

回答

2

我当时玩的是boost :: interprocess,碰巧问了同样的问题。在最终解决open_or_create需求之前,我做了一点挖掘。然而,深模板意大利面条的肠子是升压(我的是1.62),我们发现这种宝石:以上

 /*<... snip ...>*/ 
    //This loop is very ugly, but brute force is sometimes better 
    //than diplomacy. If someone knows how to open or create a 
    //file and know if we have really created it or just open it 
    //drop me a e-mail! 
    bool completed = false; 
    spin_wait swait; 
    while(!completed){ 
     try{ 
      create_device<FileBased>(dev, id, size, perm, file_like_t()); 
      created  = true; 
      completed = true; 
     } 
     catch(interprocess_exception &ex){ 
      if(ex.get_error_code() != already_exists_error){ 
       throw; 
      } 
      else{ 
       try{ 
       DeviceAbstraction tmp(open_only, id, read_write); 
       dev.swap(tmp); 
       created  = false; 
       completed = true; 
       } 
       catch(interprocess_exception &e){ 
       if(e.get_error_code() != not_found_error){ 
        throw; 
       } 
       } 
       catch(...){ 
       throw; 
       } 
      } 
     } 
     catch(...){ 
      throw; 
     } 
     swait.yield(); 
    } 

    /* <... snip ...> */ 

是managed_open_or_create_impl.hpp大约360线,在priv_open_or_create()方法。似乎答案是否定的。不,在尝试打开共享内存之前,没有办法检查是否创建了共享内存。

相关问题