PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : abnormale Variablen an fkt übergeben



mithras
01-05-2003, 00:05
Ich arbeite mit Shared Memory zwischen verwandten Prozessen. (mit Hilfe von /dev/zero).

Ich initialisieren in der main() über folgenden Code:



caddr_t adr;
mmap_typ *mmap_adr;



Nun kann ich in der main() (ok es sind noch ein paar andere Zeilen Code nötig, wie z.B. eine global definierte Struktur), in einen Speicherbereich schreiben, auf den dann ein anderer (verwandter) Prozess zugreifen kann, also die gleiche Variable auslesen kann.

Ich möchte aber von einer anderen Funktion aus darauf zugreifen, also ich ja die oben initialisierten Werte der Funktion übergen (event auch noch den fd übergen), wie mach ich das!?



if ( (fd_sm=open("/dev/zero", O_RDWR)) < 0)
printf("kann /dev/zero nicht öffeln!\n");

if ( (adr = mmap(0, sizeof(mmap_typ), PROT_READ | PROT_WRITE, MAP_SHARED, fd_sm, 0)) ==(caddr_t)-1)
printf("mmap fehler!\n");

mmap_adr = (mmap_typ *)adr;


dieser obige Code steht außerdem noch in der main, und noch eine Struktur.

anda_skoa
01-05-2003, 09:40
Müsste für Shared Memory nicht irgendwo shmget stehen?

Ciao,
_

pik7
01-05-2003, 10:46
hallo,

ansa_skoda:
ist kein shared memeory in dem sinne das verschiedene Prozesse
über einen gemeinsamen Key drauf zugreifen können.
Er macht das über mmap():
Aus der Frage von mithras werde ich sowiso nicht schlau
Er hat wohl jetzt das problem das er die Werte auch in einem
anderen Prozess benutzen möchte und nicht aus einer andren Funktion.
Könnte man eventuell mit einer Pipe machen.

gruß

mithras
01-05-2003, 10:55
Also ich hab das Problem, dass ich die Werte sowohl in einem anderen (aber verwandten) Prozess (daher auch mmap) und in verschiedenen Funktionen daraufzugreifen muss.

Mit pipe hab ich mir auch schon überlegt, ist aber wesentlich umständlicher, da ich dann aufwendige Synchronisation zwischen den beiden Prozessen einbauen muss.
Würde das lieber mit shared memory bzw. via mmap machen, nur weiß ich nicht wie ich das dann mit verschiedenen Funktionen realisieren soll. Also ich initialisiere bzw. definiere die Strukturen das ganze für mmap halt in der main, dann forke ich, und in jedem Prozess wird eine fkt. gesartet und in jeweils einer dieser funktionen muss ich dann auf /dev/zero zugreifen können eben mmap benutzen können, allerdings muss ich doch dann den beiden fkten die Strukturen etc. übergeben dass ich in der fkt. dann mmap benutzen kann.

pik7
01-05-2003, 11:58
hallo,

kann man doch z.b ein tmp file machen
tmpfile() und dann fwrite() und fread() benutzen.
Wenn du den fd noch benutzen willst
der wird bei einem fork vererbt (das gleiche wie dup())
und er zeigt auf den gleichen Eintrag in der Dateitabelle.

gruß

mithras
01-05-2003, 13:50
der filedeskriptor ist eigentlich gar nicht das problem, denn diesen muss ich der fkt ja gar nicht übergeben, da ich durch folgenden code:


caddr_t adr;
mmap_typ *mmap_adr;
int fd_sm;

if ( (fd_sm=open("/dev/zero", O_RDWR)) < 0)
printf("kann /dev/zero nicht öffeln!\n");

if ( (adr = mmap(0, sizeof(mmap_typ), PROT_READ | PROT_WRITE, MAP_SHARED, fd_sm, 0)) ==(caddr_t)-1)
printf("mmap fehler!\n");

mmap_adr = (mmap_typ *)adr;
close(fd_sm);



Die Adresse des Speicherbereichs in adr schreiben lasse.
Der filedeskriptor wird ja danach wieder geschlossen.
Über mmap_adr->zahl1 = 10; hab ich zugriff auf den Wert, und zwar in beiden Prozessen. Allerdings nicht, und das ist das Problem, in einer anderen Funktion!

Ich mein ich könnte die Funktionen auflösen und alles in die main packen dann würds gehen, aber das ist ja kein guter Prog-Stil.

pik7
01-05-2003, 13:59
Und wenn man nmap_adr programmglobal macht oder
der Funktion mitgibt z.b funct(mmap_adr *, ...);
?

mithras
01-05-2003, 18:25
ne also wenn dann schon mit Übergabe an die Funktion. Aber das ist ja mein Problem.
Denn mmap_adr ist ja ein Zeiger des Typs mmap_typ und wurde ja schließlich so deklariert: mmap_typ *mmap_adr.

Wie muss dann der Funktionsheader bzw. der Prototyp und die Syntax bei der Übergabe aussehen!? Also weil mmap_adr ist ja ein Zeiger auf die Struktur



typedef struct {
int zahl1;
int zahl2;
} mmap_typ;


Ich könnte doch das ganze auch ohne Struktur machen, oder!?

pik7
01-05-2003, 18:40
Prototyp:
funkt(mmap_typ*);
Aufruf:
funkt(mmap_add);
Zugriff:
mmap_add->zahl1;
mmap_add->zahl2;