Désactiver le core dump pour le signal SIGHUP

J’essaie de désactiver les sauvegardes de base générées pour des signaux individuels dans mon application.

ulimit -c 0 ne fonctionnera pas dans mon cas, car il doit être exécuté avant le démarrage de l’application et va complètement désactiver les sauvegardes de base pour tous les signaux.

Est-il possible de faire une telle exception pour un seul signal ou au moins de désactiver la génération de core dump pendant un certain temps (par exemple pendant l’envoi du signal SIGHUP)?

 #include  #include  #include  #include  #include  static sigjmp_buf sigjmp; static void sighup_handler(int signo) { siglongjmp(&sigjmp, signo); } int main(int argc, char **argv) { struct sigaction sighup_action = { .sa_handler = &sighup_handler, .sa_flags = SA_RESETHAND, }; sigset_t sigset; int signo; sigemptyset(&sighup_action.sa_mask); sigaddset(&sighup_action.sa_mask, SIGHUP); sigprocmask(SIG_BLOCK, &sighup_action.sa_mask, &sigset); sigaction(SIGHUP, &sighup_action, NULL); signo = sigsetjmp(&sigjmp, 1); if (signo) { struct rlimit rl = { .rlim_cur = 0, .rlim_max = 0 }; setrlimit(RLIMIT_CORE, &rl); sigprocmask(SIG_SETMASK, &sigset, NULL); kill(getpid(), signo); abort(); /* just in case */ _exit(128 | signo); } sigprocmask(SIG_SETMASK, &sigset, NULL); pause(); /* or whatever the rest of your program does */ } 

Vous pouvez installer un gestionnaire de signal qui définit RLIMIT_CORE sur 0, puis procède à l’action de signal par défaut. Si vous utilisez SA_RESETHAND , le gestionnaire de signaux par défaut est automatiquement réinstallé juste avant l’exécution du gestionnaire de signaux. Cependant, setrlimit n’est pas async-signal-safe, nous ne devrions donc pas l’appeler depuis un gestionnaire de signal, donc utiliser siglongjmp pour revenir au code normal et l’exécuter là.

Ajoutez simplement un gestionnaire de signal vide pour SIGHUP ou ignorez-le comme ceci:

 signal(SIGHUP, SIG_IGN);