Forum: PC-Programmierung shared mamory: MAX_Speicherreservierung


von Elvis (Gast)


Lesenswert?

Hallo,

ich programmiere mit C unter Linux(Suse 11.1,64bit).

Ich wollte einen bzw. mehrer Shared Mamory Bereiche erstellen die 
grösser als 340 000 byte sind.

Dazu Habe ich ein Testprogramm gefunden und ausprobiert. Das 
testprogramm läuft auch soweit so gut bis man MAXMYMEM auf 340000 setzt.
Aus irgend einen Grund wird kein gemeinsamer Speicher angelegt. Mir 
gehen die Ideen aus. kann es sein dass was compilieren falsch läuft?? 
oder die hardware es nicht mitmacht?

hier der beispilcode:

#define MAXMYMEM 30   <-- sobald 340000, shmget: Invalid argument


int main(int argc, char **argv)
{
int shID;
char *myPtr;
int i;

/* Shared Memory erzeugen */
    shID = shmget(2404, MAXMYMEM, IPC_CREAT | 0666);
    if (shID >= 0) {
        /* nun holen wir den Speicher */
        myPtr = shmat(shID, 0, 0);
        if (myPtr==(char *)-1) {
            perror("shmat");
        } else {
            /* Speicher ist zugreifbar: füllen! */
            for (i=0; i<MAXMYMEM; i++) {
                myPtr[i] = 'A'+i;
            }
            getchar(); /* Warte mal auf eine Taste */
            /* gebe den Speicher auf */
            shmdt(myPtr);
        }
    } else { /* shmget lief schief */
        perror("shmget");
    }
}

von Stephan W. (sir_wedeck)


Lesenswert?

Hi

ich kenne mich mit Linux zwar nicht so gut aus, aber schau mal hier:

http://man.cx/SHMGET%282%29

Dort unter Notes, kannst du mal deine MIN und MAX Values für den Shared 
Memory Bereich auf deinem Linux untersuchen.

Stephan

von Elvis (Gast)


Lesenswert?

hi danke für die antwort. in /proc/sys/kernel/shmmax, steht für max ein 
wert von ca. 1.8*e9 drinne also 1,8gb ich muss dazu sagen das mein 
rechner einen 11gb grossen arbeitsspeicher hat ;-).

von Gerry E. (micky01)


Lesenswert?

Elvis schrieb:
> hi danke für die antwort. in /proc/sys/kernel/shmmax, steht für max ein
> wert von ca. 1.8*e9 drinne also 1,8gb ich muss dazu sagen das mein
> rechner einen 11gb grossen arbeitsspeicher hat ;-).

Ich sage es ja immer: Täglich steht mindestens einer auf, dem man den 
größten Unfug erzählen kann, und der das dann auch noch glaubt. 11 
gleine bits...

Ach ja, einer fehlt noch: ELVIS LEBT!!!

von Clown (Gast)


Lesenswert?

Die Kommandos ipcs und ipcrm sollen hier von Interesse werden. Mit ipcs 
werden alle IPC Ressources angezeigt. Unter anderem auch die mit 
shmget() angeleten Speicherbereiche. Mit ipcrm können diese 
Speicherbereiche dann auch wieder freigegeben werden, wenn diese nicht 
mehr benötigt werden und das nicht bereits Programmgesteuert geschieht.

Das Problem mit dem Quelltext oben ist vermutlich folgendes: Bei den 
ersten Durchläufen funktioniert alles problemlos. Erst wenn nun die 
Speichergröße erhöht wird, schlägt der Aufruf fehl. Verkleinern sollte 
jedoch möglich sein.

Beim ersten Aufruf wird unter dem angegebenen Schlüssel - erster 
Parameter von shmget() - ein Speicher der geforderten Größe angelegt. 
Folgende Aufrufe können diesen Speicherbereich nicht vergrößern. Es kann 
nur auf maximal den, beim ersten Aufruf reservierten, Bereich oder einen 
kleineren Teil davon zugegriffen werden.

Damit das Beispiel oben besser funktioniert, sollte beispielsweise der 
Speicher, falls shmget() fehlschlägt, mit der shmctl() Funktion 
freigegeben und dann noch einmal mit shmget() der Speicher angefordert 
werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.