• # Étrange, mais un (équivalent de) raise() depuis un gestionnaire de signaux...

    Posté par (site web personnel) . En réponse au message probleme avec sigaction. Évalué à 2.

    De mon côté, une fois que j'ai ajouté les #include qui manquent, soit :

    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #define SIGSEGV 11
    void fToCallIfSegFault(int sig)
    {
     fprintf(stdout, "il y a eu un segfault dans ton code mon coco, le sig = %i\n", sig);
     kill(getpid(), sig);
    }
    int main(int argc, char const *argv[])
    {
     struct sigaction act;
     act.sa_handler = fToCallIfSegFault;
     sigaction(SIGSEGV, &act, NULL);
     //on genere un segfault
     char* str = NULL;
     str[0] = 'c'; //erreur de segmentation
     return 0;
    }

    J'ai bien ceci en boucle :

    il y a eu un segfault dans ton code mon coco, le sig = 11
    il y a eu un segfault dans ton code mon coco, le sig = 11
    il y a eu un segfault dans ton code mon coco, le sig = 11
    

    ... ou bien un arrêt instantané, ou bien un arrêt après plus ou moins longtemps.

    Dans mes vieux souvenirs (mais je n'ai pas de source pour cela), il me semble qu'on disait qu'un gestionnaire de signal, sur SIGSEGV du moins, était censé faire une chose et une seule : appeler backtrace, finir de loguer et quitter.

    Quoi qu'il en soit, je t'invite à lire (en anglais) cette section de la page wikipedia sur les signaux, notamment la première phrase :

    Signal handling is vulnerable to race conditions.
    

    Debian Consultant @ DEBAMAX