6 votes

Existe-t-il une façon standard pour perl de se comporter lorsqu'il manque de mémoire ?

Existe-t-il une façon standard (ou presque) pour un interpréteur Perl (alias "perl") de se comporter lorsqu'il manque de mémoire ? Est-ce que c'est documenté/spécifié d'une manière ou d'une autre ? Codé de manière uniforme ?

Je suis particulièrement intéressé par les standards qui sont exprimés comme une convention avec le code Perl en cours d'exécution - par exemple, est-ce que die sera-t-il appelé ? Est-ce que END sera-t-il exécuté ? Etc...

Je suis d'accord à la fois avec une réponse "théorique" (par exemple, une sorte de document générique "c'est ce que le code Perl doit faire en général en cas de sortie de mémoire" de Larry/P5P/etc..., même si 100% des appels malloc() ne suivent pas cette règle) ; ou une réponse "pratique" (par exemple, tous les appels malloc() en Perl sont enveloppés dans une fonction générique "allocate_memory" qui gère uniformément tous les échecs).

Il est possible que la réponse dépende de ce qui provoque spécifiquement le manque de mémoire (par exemple, une demande de plus de mémoire pour la structure de données du code Perl ou de la mémoire allouée par le code Perl interne sans rapport avec la logique explicite de "besoin de stocker plus de données" dans le programme Perl).

Si la réponse est extrêmement dépendante de l'implémentation, supposez que perl pour Solaris/Linux, et la réduction à toute version stable récente (5.8 à 5.16) est acceptable.

La question est limitée à l'interpréteur Perl standard, quelle que soit la manière dont vous souhaitez le définir en ce qui concerne la configuration de la précompilation (par exemple, perl fourni avec une distribution Linux majeure, ou compilé avec tous les paramètres par défaut, etc...).

REMARQUE : Cette question découle du commentaire de Gilles à l'adresse suivante <a href="https://stackoverflow.com/questions/13234866/can-a-perl-system-call-ever-die#comment18042068_13234866">un autre Q</a>

6voto

Toby J Points 942

En regardant le page du manuel pour les différents avertissements de diagnostic que Perl émet lorsque le pragma "use diagnostics" est activé, vous pouvez voir différents types d'erreurs "out of memory" et leur signification.

Vous pouvez donc déduire le comportement "standard" à partir de ces messages ; celui qui comporte un point d'exclamation ("Out of memory !") ressemble à celui qui fait l'objet de votre question :

Out of memory!
(X) The malloc() function returned 0, indicating there was
insufficient remaining memory (or virtual memory) to satisfy the
request.  Perl has no option but to exit immediately.

Une erreur de niveau "X" est étiquetée comme "Une erreur très fatale (non trappable)".

Cependant, s'il s'agit d'une "grande demande" (supérieure à 64K), elle est trappable (je suppose que Perl suppose qu'il aura assez de mémoire pour s'arrêter proprement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X