Eine Instanz > mehrere Prozesse > Problem?

06/11/2014 - 09:42 von Heinz-Mario Frühbeis | Report spam
Hallo,

ich habe hier (wiedermal<g>) ein kleines Problemchen...und versuche es
mal aufzuzeigen.

Ein Programm PROG_X inkludiert eine Lib IDA, die eine Klasse EBIDA
inkludiert, aber in der cpp-Datei.
PROG_X ruft in IDA Test() auf...
Ein Programm PROG_Y inkludiert auch IDA wird aber aus IDA.Test() heraus
gestartet.

EBIDA.h:
class EBIDA{
private:
static int Instanzen;
int Instanz;
public:
EBIDA();
~EBIDA();
int Test();
int Test1();
};

EBIDA.cpp:

int EBIDA::Instanzen;

EBIDA::EBIDA(){
this->Instanzen++;
this->Instanz = this->Instanzen;
}

EBIDA::~EBIDA(){
this->Instanzen--;
}

int EBIDA::Test(){
IDAFunk::Std_CoutA("EBIDA TEST INSTANZEN", this->Instanzen,
this->Instanz); // [1]
std::string nPath = "PFAD ZU PROG_Y"; // PROG_Y inkludiert auch IDA!
pid_t pid = fork();
if (pid == 0){
execl(nPath.c_str(), nPath.c_str(), "-install", NULL);
exit(127);
}
else {waitpid(pid, 0, 0);}
return 1;
}

int EBIDA::Test1(){
IDAFunk::Std_CoutA("EBIDA TEST INSTANZEN", this->Instanzen,
this->Instanz); // [1]
return 1;
}



IDA.h:
class IDA{
public:
IDA(){};
virtual ~IDA(){};
virtual int Test();
virtual int Test1();
};

IDA.cpp:
#include "ida.h"
#include "ebida.h"

int IDA::Test(){
return nEBIDA.Test();
}

int IDA::Test1(){
return nEBIDA.Test1();
}

Die Ausgabe [1] lautet nun aber immer:
EBIDA TEST INSTANZEN 1 1

Also immer nur eine Instanz.

Ist das jetzt eigentlich ein Problem, weil ja eine Instanz (wie im Bsp.)
in zwei Prozessen "angesprochen" wird?

Hintergrund:
Ich könnte EBIDA ja auch in der h-Datei von IDA inkludieren und z. Bsp.
in ins private-Segment einsetzen, aber dafür müßte ich (AFAIK) fürs
Linken die h-Datei von EBIDA bereitstellen, was ich eigentlich vermeiden
möchte, weil ich davon ausgehe (ungetestet), daß "man" die h-Datei
umschreiben kann und womöglich an private-Member kommt (manipulieren).
Wenn ich z. Bsp. einen Instanzen-Zàhler als private in die h-Datei von
IDA setze, dann könnte man doch wohl die h-Datei im public-Segment so
umschreiben, daß man z. Bsp. den Instanzen-Zàhler hoch bzw. runter
setzt...(oder nicht<?>).
Jedenfalls kann ich (so mein Gedanke) die privaten Member von EBIDA
schützen, wenn ich EBIDA in der cpp-Datei von IDA inkludiere.

Ich hoffe, daß ich alles, fürs Verstàndnis nötige, beschrieben habe...
Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Heinz-Mario Frühbeis
06/11/2014 - 10:47 | Warnen spam
Am 06.11.2014 um 09:42 schrieb Heinz-Mario Frühbeis:
Hallo,

ich habe hier (wiedermal<g>) ein kleines Problemchen...und versuche es
mal aufzuzeigen.

Ein Programm PROG_X inkludiert eine Lib IDA, die eine Klasse EBIDA
inkludiert, aber in der cpp-Datei.
PROG_X ruft in IDA Test() auf...
Ein Programm PROG_Y inkludiert auch IDA wird aber aus IDA.Test() heraus
gestartet.

EBIDA.h:
class EBIDA{
private:
static int Instanzen;
int Instanz;
public:
EBIDA();
~EBIDA();
int Test();
int Test1();
};

EBIDA.cpp:

int EBIDA::Instanzen;

EBIDA::EBIDA(){
this->Instanzen++;
this->Instanz = this->Instanzen;
}

EBIDA::~EBIDA(){
this->Instanzen--;
}

int EBIDA::Test(){
IDAFunk::Std_CoutA("EBIDA TEST INSTANZEN", this->Instanzen,
this->Instanz); // [1]
std::string nPath = "PFAD ZU PROG_Y"; // PROG_Y inkludiert auch IDA!
pid_t pid = fork();
if (pid == 0){
execl(nPath.c_str(), nPath.c_str(), "-install", NULL);
exit(127);
}
else {waitpid(pid, 0, 0);}
return 1;
}

int EBIDA::Test1(){
IDAFunk::Std_CoutA("EBIDA TEST INSTANZEN", this->Instanzen,
this->Instanz); // [1]
return 1;
}



IDA.h:
class IDA{
public:
IDA(){};
virtual ~IDA(){};
virtual int Test();
virtual int Test1();
};

IDA.cpp:
#include "ida.h"
#include "ebida.h"

int IDA::Test(){
return nEBIDA.Test();
}

int IDA::Test1(){
return nEBIDA.Test1();
}

Die Ausgabe [1] lautet nun aber immer:
EBIDA TEST INSTANZEN 1 1

Also immer nur eine Instanz.

Ist das jetzt eigentlich ein Problem, weil ja eine Instanz (wie im Bsp.)
in zwei Prozessen "angesprochen" wird?

Hintergrund:
Ich könnte EBIDA ja auch in der h-Datei von IDA inkludieren und z. Bsp.
in ins private-Segment einsetzen, aber dafür müßte ich (AFAIK) fürs
Linken die h-Datei von EBIDA bereitstellen, was ich eigentlich vermeiden
möchte, weil ich davon ausgehe (ungetestet), daß "man" die h-Datei
umschreiben kann und womöglich an private-Member kommt (manipulieren).
Wenn ich z. Bsp. einen Instanzen-Zàhler als private in die h-Datei von
IDA setze, dann könnte man doch wohl die h-Datei im public-Segment so
umschreiben, daß man z. Bsp. den Instanzen-Zàhler hoch bzw. runter
setzt...(oder nicht<?>).
Jedenfalls kann ich (so mein Gedanke) die privaten Member von EBIDA
schützen, wenn ich EBIDA in der cpp-Datei von IDA inkludiere.

Ich hoffe, daß ich alles, fürs Verstàndnis nötige, beschrieben habe...
Mit Gruß
Heinz-Mario Frühbeis



Möchte noch beifügen, daß PROG_Y (hat ja auch IDA inkludiert und wird ja
in IDA.Test() aufgerufen) IDA.Test1() aufruft, wo dann eben auch
EBIDA TEST INSTANZEN 1 1
ausgegeben wird. Also immer noch eine Instanz...

Ähnliche fragen