PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Korrektes Speicherhandling



panzi
06-05-2003, 14:03
Also ich hab zur übung (Morgen ist Test) ein kleines C Programm geschrieben.
Es implementiert UPN mit ner Liste als Stack. Dazu wird in push() ein neues Element angelegt und der Liste hinzugefügt.

Wenn das Anlegen nicht funktioniert liefert malloc doch NULL zurück. Meine Frage: wie kann ich Testen ob das Speicherhandling richtig funktioniert?
Also ich will absichtlich die situation schaffen das mein Prog nicht genügend Speicher zur verfügung hat, wie geht das?

Mit ulimit (-m und -v) kann ich zwar begrenzen, aber es ist eintweder zu viel begrenzt (nichtmal ein weiteres ulimit funktioniert mehr) oder ich hab zu viel Speicher...

Gibt's dafür denn kein komfortables Tool bzw. kann man in ddd (bzw. gdb) irgendwie sagen: jetzt gibt's keinen weiteren Heap für dich!
Das Schätzen mit ulimit ist etwas mühsam...


DANKE für eure Hilfe!

pik7
06-05-2003, 16:35
hallo,

beschränke doch einfach die Anzahl
der malloc Aufrufe.
z.b


void *speicher(...)
{
static int count=0;

if(count<10)
return malloc(.....);
else
return NULL
}


gruß

anda_skoa
06-05-2003, 17:26
Original geschrieben von panzi

Also ich will absichtlich die situation schaffen das mein Prog nicht genügend Speicher zur verfügung hat, wie geht das?


Das geht eigentlich echt nur über ulimit.

Denn wenn da unter Linux das malloc keine Speicher mehr bekommt, weil im ganzen System keiner mehr zu haben ist, killt der Kernel das Programm ohnehin.

Ciao,
_

pik7
06-05-2003, 19:19
hallo,

wenn schon ulimit dann nicht vergessen
ob Soft- oder Hard limit. (-H oder -S)
Wenn du ulimit nicht mitgibst was du für ein Limit gesetzt haben willst
setzt es beide Hard und Soft Limit auf den gewünchten Wert
der kleiner sein muß als der aktuelle Hard limit Wert.
Der normale User kann das Hard limit nur runtersetzen
Nur root kann das Hard limit raufsetzen.
Wobei das Softlimit nicht über das Hard limit gesetzt werden kann.

Deswegen funktioniert vermutlich auch der nachträgliche ulimit aufruf nicht mehr.
Du kannst natürlich auch setrlimit() benutzen und da steht folgendes.

EPERM A non-superuser tries to use setrlimit() to
increase the soft or hard limit above the current
hard limit, or a superuser tries to increase
RLIMIT_NOFILE above the current kernel maximum.

nur mal so nen Hinweis

gruß