Ich bin mit dem einfachstenen Interprozess-Kommunikation Programm Setup boost::interprocess
mit:C++ Segmentation fault wenn try-catch eingeführt wird
#include <boost/interprocess/managed_shared_memory.hpp>
#include <cstdlib> //system
#include <iostream>
using namespace std;
using namespace boost::interprocess;
typedef pair<double, int> MyType;
int main(int argc, char *argv[]) {
if (argc==1) { //Parent process
struct shm_remove {
shm_remove() {shared_memory_object::remove("MySharedMemory");}
~shm_remove() {shared_memory_object::remove("MySharedMemory");}
} remover;
managed_shared_memory segment(create_only,"MySharedMemory",65536);
MyType* instance=segment.construct<MyType>("MyType instance")(0.5,2);
string s(argv[0]);
s+=" child ";
if(system(s.c_str())!=0) {
cout<<"Parent: Child process returned non-zero"<<endl;
return 1;
}
cout<<"Parent: Child process finished successfully"<<endl;
segment.destroy<MyType>("MyType instance");
} else { //Child process
pair<MyType*, managed_shared_memory::size_type> res;
// try {
managed_shared_memory segment(open_only, "MySharedMemory");
res=segment.find<MyType>("MyType instance");
// } catch (interprocess_exception &e) {
// cerr<<"Error while opening the segment"<<endl;
// return 1;
// }
cout<<"Child: Segment of length "<<res.second<<" is found at "<<res.first<<endl;
cout<<"Child: "<<res.first->first<<", "<<res.first->second<<endl;
}
return 0;
}
Dies funktioniert, und ich sehe:
Child: Segment of length 1 is found at 0x106a15148
Child: 0.5, 2
Parent: Child process finished successfully
Allerdings, wenn ich Kommentar- der try-catch
Block, sehe ich folgendes:
Child: Segment of length 1 is found at 0x10a8fd148
Parent: Child process returned non-zero
Wenn ich die binäre in zwei (Segment erzeugenden und für immer schlafend Eltern und Segment-Lese Kind) zu brechen, es funktioniert wieder ohne try-cacth
, aber damit das Kind stürzt mit
Segmentation fault: 11
Daher habe ich zwei Fragen:
- Was verursacht die Einführung der
try-catch
Ursache? Es verhält sich so, als hätte der Block seinen eigenen Adressraum. Aber warum sollte es? - Wie sicher nach dem Vorhandensein des erforderlichen Segments zu überprüfen und eine Fehlermeldung generieren, die nicht gefunden wird?
EDIT:
if (1) {
managed_shared_memory segment(open_only, "MySharedMemory");
res=segment.find<MyType>("MyType instance");
cout<<"Child: Segment of length "<<res.second<<" is found at "<<res.first<<endl;
cout<<"Child: "<<res.first->first<<", "<<res.first->second<<endl;
}
Ich bekomme den gleichen Fehler:
Child: Segment of length 1 is found at 0x108c15148
Child: 0.5, 2
Child: Segment of length 1 is found at 0x108c15148
Parent: Child process returned non-zero
Daher ist das Verhalten in der Tat durch, verursacht wird
ich den Block geändert haben {}
, vermutlich aufgrund der Zerstörung von . Aber warum wäre es wichtig, wenn res.first
bereits mit dem richtigen Zeiger gefüllt ist?
Was tut 'segment' destructor? Es scheint, als ob es etwas freigibt, auf das du später zugreifen willst. – lapk