Markus Raab wrote:
Gerhard Brauer wrote:Meine Versuche mit malloc scheiterten kläglich ;-) Wenn ich Speicher größer mem+swap reserviere kriege ich nur einen Null pointer. Wenn ich knapp drunter bleibe und in den Pointer reinschreibe killt der Kernel irgendwann (neben anderem "unwichtigem Zeug") meinen eigenen Prozeß.
Stimmt, so ähnlich habe ich das bei gerade auch beobachtet. Ein malloc(x)==NULL lässt sich wohl nicht abfangen...
Du bist schon auf den richtigen Weg. Jetzt baue am Ende noch ein while fork() mit ein bissi Wartezeit ein, dann killt der Kernel zwar trotzdem, aber du hast immer einen neuen Prozess der dir den Memory füllt.
Ich habe jetzt mal ein Beispiel aus meinem schlauen Buch dementsprechend etwas angepasst. Simulierte zumindest bei mir einen Runaway-Process, der nach und nach den Speicher füllt und hübsche Load verursacht. Was am Ende passiert, wollte ich dann doch nicht mehr probieren...:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #define ONE_K (1024) int main(){ char *some_memory; int size_to_allocate = ONE_K; int megs_obtained = 0; int ks_obtained = 0; while(1){ for (ks_obtained =0; ks_obtained < 1024; ks_obtained++){ some_memory = (char *)malloc(size_to_allocate); if (some_memory == NULL) exit(EXIT_FAILURE); sprintf(some_memory, "touched"); // send child to a dead end sleep if (!fork()) for(;;) ; } megs_obtained++; printf("Now allocated %d Megabytes\n", megs_obtained); } exit(EXIT_SUCCESS); } Und dann eventuell mal das ! vor dem fork() entfernen. hth, Wolf --..., aber nur, wer sich vom Stumpf- und Wahnsinn ein Bild machen kann, ist auch in der Lage, dies für sich zu bewerten und ist nicht auf den 'großen Bruder' angewiesen. Nur wer Zugriff auf möglichst viel Information hat, kann auch darüber urteilen, was Fehlinformation ist. (GHopper im Heise-Forum)