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.