Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 16. Nov 2018 15:25

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: malloc problem
BeitragVerfasst: 06. Okt 2006 9:15 
hallo,
wieso funktioniert mein malloc so nicht?
Code:
#include"malloc.h"
void check_malloc(size_t bytes);
double test;
int main()
{

   test = (double *)check_malloc(5*sizeof( double ));

}
Code:
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <string.h>
void check_malloc&#40;size_t bytes&#41;; 

 void check_malloc&#40;size_t bytes&#41;
&#123;
 void *tmp;
 tmp= &#40;void*&#41; malloc&#40;bytes&#41;;
 if&#40;tmp==NULL&#41;
 &#123;

    fprintf&#40;stderr, "ERROR &#58; Out of memory ?!\n"
                    "        Trying to &#40;m&#41;allocate %i Bytes failed !\n"
                    "        File&#58; %s  Line&#58; %d\n", &#40;int&#41; bytes&#41;;
    exit&#40;1&#41;;
  &#125;
  return tmp;
 &#125;
Fehlermeldung:
In file included from malloc.c:5:
../malloc.h: In function `check_malloc':
../malloc.h:19: warning: `return' with a value, in function returning void
malloc.c: In function `main':
malloc.c:11: error: void value not ignored as it ought to be

merci,
nakaa


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 06. Okt 2006 12:03 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
1. Dein main() ist als int vereinbart, liefert aber keinen Wert zurück. Außerdem muss das in C int main(void) heißen, oder int main(int argc, char* argv[]). int main() ist eine C++-Notation.
2. Dein check_malloc() ist als void vereinbart, hat aber als letzten Befehl "return" und der Rückgabewert soll in main() ein double* sein. Das ist doch ziemlich durcheinander.
3. Um malloc() benutzen zu können, muss man <stdlib.h> einbinden.

Im übrigen wird unter Linux malloc() normalerweise niemals NULL zurückliefern, vorher werden wahllos Prozesse gekillt. Wenn du das verhindern willst, musst du das Memory Overcommit abschalten.
Code:
# echo 2 >/proc/sys/vm/overcommit_memory
Janka

_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 06. Okt 2006 13:48 
gedöns!
unter http://www.c-plusplus.de/forum/viewforu ... 277e822d5c
des rätsels lösung....


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 08. Okt 2006 14:25 
Offline
prolinux-forum-admin
Benutzeravatar

Registriert: 05. Mai 2004 7:35
Beiträge: 1238
Zitat:
Im übrigen wird unter Linux malloc() normalerweise niemals NULL zurückliefern, vorher werden wahllos Prozesse gekillt. Wenn du das verhindern willst, musst du das Memory Overcommit abschalten.
Hi Janka

Aus Interesse: Gilt das auch für Prozesse, die nicht die UID desjenigen tragen, der malloc aufruft (außer bei root natürlich)?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 08. Okt 2006 18:00 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
Ja. Da das vm-Subsystem die Schuld an einem durch overcommit überfüllten Speicher ja selten einem bestimmten Prozess oder auch nur Benutzer zuordnen kann -- schließlich brauchen alle Prozesse den Speicher --, erwischt es halt auch alle Prozesse, bis wieder genügend Speicher frei ist. Der Fehler tritt ja auch nicht bei malloc() auf, sondern erst, wenn *irgendein* Prozess den vor Urzeiten angeforderten Speicher auch tatsächlich beschreiben will. Das ist ja gerade der Sinn des Overcommit. Man macht ein malloc(1024*1024), weil einen 1MB-Puffer irgendwann mal braucht. Kriegen tut man den Speicher aber erst, und auch nur pageweise, wenn man eine bestimmte Page beschreibt!

Ob root-Prozesse als letzte gekillt werden, müsste ich erst einmal nachgucken. Evtl. ist das auch konfigurierbar.

Memory Overcommit ist für Desktop-Systeme ziemlich sinnvoll, finde ich, weil jeder Prozess sehr viele Dateien komplett in den Speicher mappen darf -- knatsch gibt es erst, wenn RAM *und* Swap aufgebraucht sind. In diesem Fall ist das System aber durch den Swap-Gebrauch schon so langsam, dass der Benutzer freiwillig die Prozesse beendet, die er gerade nicht braucht.

In einem Server ist Memory Overcommit allerdings ziemlich fies, da das Gerät normalerweise ohne direktes Admin-Feedback läuft und ein drohender Speicherüberlauf normalerweise nicht erkannt wird. In diesem Anwendungsfall ist es sicher besser, es abzuschalten, da die Prozesse sich zumindest ordentlich beenden können (im Falle von apache etc. wird ja sogar nur das sich eben gerade böse verhaltenene Kind beendet). So erst ist eine Fehlersuche möglich.

Ich bin über dieses Verhalten selbst schon einmal gestolpert und habe mich danach informiert. Für genauere Informationen müsstest du selbst nachlesen.

Janka

_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.


Nach oben
   
BeitragVerfasst: 08. Okt 2006 20:08 
Janka:
Zitat:
Im übrigen wird unter Linux malloc() normalerweise niemals NULL zurückliefern, vorher werden wahllos Prozesse gekillt. Wenn du das verhindern willst, musst du das Memory Overcommit abschalten.
Also, wenn ich bei mir mehr Speicher anfordere, als frei ist, liefert malloc NULL. Ohne Prozesskillerei oder abgesch. Overcommit. Den gesammten freien Speicher kann ich allerdings auch mehrmals (zur selben Zeit) allozieren: Linux' optimistic memory allocation strategy. Ernst wird es doch erst, wie Janka sagt: »wenn *irgendein* Prozess den vor Urzeiten angeforderten Speicher auch tatsächlich beschreiben will«.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 08. Okt 2006 22:41 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
Stimmt, die Default-Strategie sagt wohl: Wird "viel zu viel" angefordert, gibt mmap() und damit auch malloc() einen Fehler zurück. Also, z.B. wenn man mehr als RAM+Swap zusammen auf einmal anfordert.

Janka

_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de