www.mikrocontroller.net

Forum: PC-Programmierung shared mamory: MAX_Speicherreservierung


Autor: Elvis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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");
    }
}

Autor: Stephan W. (sir_wedeck)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elvis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-).

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Clown (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.