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".


Anmelden zum Antworten