[C] Shared geheugen gebruiken voor twee threads

Pagina: 1
Acties:

  • Hielko
  • Registratie: Januari 2000
  • Laatst online: 05:11
Ben enigzins een C beginneling, maar uit onderstaande kom ik net echt uit. Wat ik wil is een programma maken met twee threads die communiceren via shared memory. Leek me niet echt moeilijk, maar ik krijg het niet voor elkaar dat beide threads toegang kunnen krijgen tot het geheugensegment.

Wat ik doe is het volgende, in de main() methode maak ik een segment aan:
C:
1
2
3
4
5
// shared memory
shn_key = IPC_PRIVATE;
  
/* Allocate a shared memory 1MB segment. */
segment_id = shmget (shn_key, getpagesize()*256, 0644 | IPC_CREAT);  


Vervolgens heb ik twee verschillende processen waarin het volgende gedaan wordt:

C:
1
2
3
char* shared_memory;
// Attach the shared memory segment.
shared_memory = (char*) shmat (segment_id, (void *)0, 0);


Lijkt mij super basic, maar blijkbaar doe ik iets fout. Als ik namelijk check naar welk adres shared_memory verwijst krijg ik voor het ene (als eerste uitgevoerde) proces: 0x40973000 (goed) en de ander krijgt 0xffffffff (fout).

Welke (ongetwijfeld beginners) fout bega ik?

  • 4VAlien
  • Registratie: November 2000
  • Laatst online: 08-04 20:02

4VAlien

Intarweb!

edit: ik heb nog 2 voorbeelden plak die er zowel ff bij.

http://130.89.161.66/~rene/shared.c
http://130.89.161.66/~rene/shmtool.c

voorlopig is het te lang geleden voor me :(

[ Voor 134% gewijzigd door 4VAlien op 21-02-2006 15:21 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 08-04 12:26
Ik lees iets over IPC_PRIVATE

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Hielko
  • Registratie: Januari 2000
  • Laatst online: 05:11
Zoals gezegd; ik ben nieuw wat dit betreft en c, maar zowel ik weet zorgt dat ervoor dat ie nieuw stuk geheugen krijgt (en niet toevallig een stuk shared memory dat een andere progamma al heeft aangemaakt).

Verwijderd

Hielko schreef op dinsdag 21 februari 2006 @ 15:09:
Ben enigzins een C beginneling, maar uit onderstaande kom ik net echt uit. Wat ik wil is een programma maken met twee threads die communiceren via shared memory. Leek me niet echt moeilijk, maar ik krijg het niet voor elkaar dat beide threads toegang kunnen krijgen tot het geheugensegment.

Wat ik doe is het volgende, in de main() methode maak ik een segment aan:
C:
1
2
3
4
5
// shared memory
shn_key = IPC_PRIVATE;
  
/* Allocate a shared memory 1MB segment. */
segment_id = shmget (shn_key, getpagesize()*256, 0644 | IPC_CREAT);  


Vervolgens heb ik twee verschillende processen waarin het volgende gedaan wordt:

C:
1
2
3
char* shared_memory;
// Attach the shared memory segment.
shared_memory = (char*) shmat (segment_id, (void *)0, 0);


Lijkt mij super basic, maar blijkbaar doe ik iets fout. Als ik namelijk check naar welk adres shared_memory verwijst krijg ik voor het ene (als eerste uitgevoerde) proces: 0x40973000 (goed) en de ander krijgt 0xffffffff (fout).

Welke (ongetwijfeld beginners) fout bega ik?
1) Je kijkt niet wat voor error shmat returned (errno).
2) Je beschrijving met wat je wilt, klopt niet echt met je doet. "een programma maken met twee threads die communiceren via shared memory" en "twee verschillende processen".

  • igmar
  • Registratie: April 2000
  • Laatst online: 27-03 10:55

igmar

ISO20022

wat zijn het nu ? Threads of processen ? Da's een aanzienlijk verschil, aangezien threads namelijk geheugen delen, en SHM daarin eigenlijk totaal geen zin heeft.Verder : 0xffffffff == -1, en als je dat terug krijgt is het handig om met perror() of strerror() even te kijken welke error je terugkrijgt :)

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Uit de code van 4vAlien kan ik afleiden dat een (1) proces het shared memory segment aanmaakt, waarna andere processen shmget() aanroepen met als derde parameter '0' ipv '0644 | IPC_CREAT'.

Vermoedelijk gaat het daar al op mis, aangezien (uit de code van 4vAlien af te leiden) shmget() zelf al -1 retourneert als het shm blok al bestaat. shmat() zal dan vermoedelijk ook -1 retourneren.
Pagina: 1