shared memory mit unterschiedliche Ein- und Ausgabe
-
ich spiele gerade ein bisschen mit shared memory unter Knoppix herum
ich habe ein C-Quellcode der bestimmte Werte in einer Shared Memory speichert und wenn schon eine shared memory angelegt wurde soll das Programm diese ausgeben:
allerdings wenn ich byte code größer 128 in der shared memory einlagere kommt komische Sachen heraus
0x80 wird zu FFFFFF80
0x79 bleibt bei 0x79
hat irgendjemand eine Idee woran es liegt und wie man dies umgehen/beseitigen kann
hier ein Quellcode ausschnitt:
-die fett geschriebenden Passagen ist das auslesen bzw das einlesen in der Shared Memory
- über die Größe der Shared Memory nicht wundern da noch mehr in der shared Memory gespeicht werden soll (ist halt nur ein Quellcodeausschnitt)
-Ausgabe:"2C FFFFFF80"#define SHMSZ 768 #define STARTDEMITER1 0x2C #define STARTDEMITER2 0x80 int shmid; key_t key; char *myPtr; key = 5678; int counter=0; if ((shmid = shmget(key, SHMSZ, 0666)) < 0) { if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { perror("shmget"); } else { myPtr = shmat(shmid, 0, 0); if (myPtr==(char *)-1) { perror("writing problem"); } else { [b] //start demiter myPtr[0] = STARTDEMITER1; myPtr[1] = STARTDEMITER2;[/b] } } } else { myPtr = shmat(shmid, 0, 0); if (myPtr==(char *)-1) { perror("writing problem"); } else { [b] for (counter=0;counter<=1;counter++) { printf(" %X",myPtr[counter]); }[/b] } }
-
Hallo,
Dein Pointer myPtr wird auf den Rueckgabewert von shmat() gesetzt das sollte afair ein void* auf eine Anfangsaddresse Deines shm sein. Den Inhalt dort ueberschreibst Du dann mit 0x2C. Dann schiebst Du myPtr um einen Index (die Laenge von einem char, also afaik zB 8 bit, dh Maximalwert bei unsigned waere dann 255, signed nur 127, dezimal) weiter und schreibst dort aber 0x80 rein - das ist zumindest fuer signed char zu gross und er wird -128 anzeigen, dezimal.Vllt liegts ja daran. Versuchs vllt mal mit unsigned char, oder irgendwie den in char angelegten bereich umrechnen auf nen andern Typ (was de halt brauchst, und haengt auch vom System ab) und immer schoen typedefen.
Ach ja, ausserdem kannste den angelegten Bereich ja vorher auch mal mit memset() "nullen".