Quand errno doit-il être affecté à ENOMEM?

Le programme suivant est tué par le kernel lorsque la mémoire est épuisée. Je voudrais savoir quand la variable globale doit être affectée à “ENOMEM”.

#define MEGABYTE 1024*1024 #define TRUE 1 int main(int argc, char *argv[]){ void *myblock = NULL; int count = 0; while(TRUE) { myblock = (void *) malloc(MEGABYTE); if (!myblock) break; memset(myblock,1, MEGABYTE); printf("Currently allocating %d MB\n",++count); } exit(0); } 

Tout d’abord, corrigez votre kernel pour ne pas trop en faire:

 echo "2" > /proc/sys/vm/overcommit_memory 

Maintenant, malloc doit se comporter correctement.

Comme “R” fait allusion, le problème est le comportement par défaut de la gestion de la mémoire Linux, qui est la “surcharge”. Cela signifie que le kernel prétend allouer votre mémoire avec succès, mais n’alloue pas réellement la mémoire jusqu’à ce que vous tentiez d’y accéder. Si le kernel découvre qu’il a alloué trop de mémoire, il tue un processus avec «le tueur OOM (Out Of Memory)» pour libérer de la mémoire. La façon dont le processus à éliminer est complexe, mais si vous venez d’allouer la majeure partie de la mémoire du système, ce sera probablement votre processus qui recevra la balle.

Si vous pensez que cela semble fou, certaines personnes seraient d’accord avec vous.

Pour qu’il se comporte comme prévu, comme R l’a dit:

echo "2" > /proc/sys/vm/overcommit_memory

Je pense que errno sera paramétré sur ENOMEM :

Macro définie dans stdio.h . Voici la documentation .

 #define ENOMEM 12 /* Out of Memory */ 

Après avoir appelé malloc dans cette déclaration:

myblock = (void *) malloc(MEGABYTE);

Et la fonction retourne NULL -car parce que le système manque de mémoire -.

J’ai trouvé cette question très intéressante.

J’espère que cela aide!

Cela se produit lorsque vous essayez d’allouer trop de mémoire à la fois .

 #include  #include  #include  int main(int argc, char *argv[]) { void *p; p = malloc(1024L * 1024 * 1024 * 1024); if(p == NULL) { printf("%d\n", errno); perror("malloc"); } } 

Dans votre cas, le tueur OOM commence par le processus.