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"); } }
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
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 ;-).
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!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.