2014-08-29 6 views
5

Der einzige Weg, wie ich das sehen konnte, war zu versuchen, darauf zuzugreifen und die Ausnahme zu fangen, die geworfen wird, wenn sie nicht da ist.Gibt es eine bessere Möglichkeit, das Vorhandensein eines Boost-Shared-Memory-Segments zu überprüfen?

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; 
} 

Gibt es einen besseren Weg?

Antwort

2

Ich spielte mit boost :: interprocess herum und stellte die gleiche Frage. Ich habe ein wenig gegraben, bevor ich mich schließlich auf open_or_create für meine Bedürfnisse festgelegt habe. Doch tief in den Eingeweiden der Vorlage Spaghetti, die boost ist (bei mir ist 1,62), so finden wir dieses Juwel:

 /*<... 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 ...> */ 

Die oben ist von managed_open_or_create_impl.hpp bei etwa Zeile 360, in der priv_open_or_create() -Methode. Scheint die Antwort ist nein. Nein, es gibt keine gute Möglichkeit zu überprüfen, ob ein gemeinsamer Speicher erstellt wurde, bevor Sie versuchen, ihn zu öffnen.