Si j'ai raison, le MOO enverra à votre processus un signal SIGTERM, afin que vous puissiez le gérer comme vous le souhaitez. Je n'avais pas raison, probablement OOM vous enverra SIGKILL et vous ne pouvez rien faire. Mais dans certaines circonstances, vous obtiendrez un SIGTERM avant.
(projet non testé)
#include <csignal>
void signal_handler(int signal) {
// Your handling code here
}
int main() {
// Install handler (assign handler to signal)
std::signal(SIGINT, signal_handler);
}
C contrepartie:
#include<signal.h>
#include<unistd.h>
void signal_handler(int signo)
{
if (signo == SIGTERM) {
// your handling code
}
}
int main(void)
{
if (signal(SIGTERM, signal_handler) == SIG_ERR) {
printf("\nError installing handler\n");
}
// Rest of your application
}
Soyez prudent lors de la manipulation des signaux, comme vous remplacez le comportement par défaut. Votre programme ne doit pas ignorer les signaux importants comme SIGTERM ou SIGINT: la fonction de gestion doit faire le travail de finition du programme ou peut-être appeler le gestionnaire d'origine. D'autre part, vous pouvez jouer avec: si vous êtes sûr que le problème est la mémoire allouée, vous pouvez essayer de libérer de l'espace inutilisé et essayer de continuer le travail (mais vous devez vous assurer que la raison du signal était) .
Pas vraiment, mais vous pouvez attacher un débogueur ... 'sudo gdb -ex exécuter --args ./programme arg1 arg2 ...' – Siguza
Comment est-il tué? SIGKILL immédiat? Que j'ai peur, il n'y a rien que vous pouvez faire, plutôt que de modifier votre application pour ne pas manger autant de mémoire. – SergeyA
Une telle fonctionnalité irait à l'encontre de l'objectif du tueur OOM - ce serait un moyen d'éviter son action. –