Unification des sources CM4/CM5 : makefiles scindés (common/cm4/cm5/cm5.debug), #ifdef CIBLE_CM5 pour GPIO, correctifs get_ip_address()/signal handler/backtrace, portabilité 32/64 bits
This commit is contained in:
+48
-18
@@ -10,7 +10,8 @@
|
||||
|
||||
// Prototypes :
|
||||
int8_t init(void);
|
||||
void sigintHandler(int dummy);
|
||||
void sigintHandler(int32_t signal);
|
||||
void sigfatalHandler(int32_t signal);
|
||||
void lancement_reinit(uint16_t tempo);
|
||||
int8_t analyse_signal(void);
|
||||
int8_t init_signaux(void);
|
||||
@@ -323,6 +324,7 @@ int8_t retour = 0;
|
||||
return(retour);
|
||||
}
|
||||
|
||||
|
||||
//==================================================================================================================================================================
|
||||
// Fonction : Initialisation des handlers de signaux (vers une seule et même fonction).
|
||||
// Reçoit : Rien
|
||||
@@ -331,41 +333,45 @@ int8_t retour = 0;
|
||||
int8_t init_signaux(void)
|
||||
{
|
||||
systeme.faucheuse.signal_recu = SYSTEME_SIGNAL_AUCUN;
|
||||
|
||||
// Signaux ne permettant pas de traitement à proprement parler (fatal) :
|
||||
// On utilise alors un gestionnaire de signaux dédié...
|
||||
signal(SIGILL, sigfatalHandler); // 4 SIGILL Instruction illégale
|
||||
signal(SIGTRAP, sigfatalHandler); // 5 SIGTRAP Trace trap
|
||||
signal(SIGABRT, sigfatalHandler); // 6 SIGABRT (ANSI) Instruction (ABORT)
|
||||
signal(SIGBUS, sigfatalHandler); // 7 SIGBUS Bus error
|
||||
signal(SIGFPE, sigfatalHandler); // 8 SIGFPE Floating-point exception - Exception arithmétique
|
||||
signal(SIGSEGV, sigfatalHandler); // 11 SIGSEGV Violation de mémoire
|
||||
signal(SIGSYS, sigfatalHandler); // 31 SIGSYS Erreur d'appel système
|
||||
|
||||
signal(SIGHUP, sigintHandler); // 1 SIGHUP Instruction (HANG UP) - Fin de session
|
||||
signal(SIGINT, sigintHandler); // 2 SIGINT Interruption
|
||||
// Signaux moins violents, permettant un traitement après réception :
|
||||
signal(SIGHUP, sigintHandler); // 1 SIGHUP Instruction (HANG UP) - Fin de session
|
||||
signal(SIGINT, sigintHandler); // 2 SIGINT Interruption
|
||||
signal(SIGQUIT, sigintHandler); // 3 SIGQUIT Instruction (QUIT)
|
||||
signal(SIGILL, sigintHandler); // 4 SIGILL Instruction illégale
|
||||
signal(SIGTRAP, sigintHandler); // 5 SIGTRAP Trace trap
|
||||
signal(SIGABRT, sigintHandler); // 6 SIGABRT (ANSI) Instruction (ABORT)
|
||||
signal(SIGIOT, sigintHandler); // 6 SIGIOT (BSD) IOT Trap
|
||||
signal(SIGBUS, sigintHandler); // 7 SIGBUS Bus error
|
||||
signal(SIGFPE, sigintHandler); // 8 SIGFPE Floating-point exception - Exception arithmétique
|
||||
signal(SIGKILL, sigintHandler); // 9 SIGKILL Instruction (KILL) - termine le processus immédiatement
|
||||
signal(SIGIOT, sigintHandler); // 6 SIGIOT (BSD) IOT Trap
|
||||
signal(SIGKILL, sigintHandler); // 9 SIGKILL Instruction (KILL) - termine le processus immédiatement. En pratique, inutile car toujours intercepté par le noyau...
|
||||
signal(SIGUSR1, sigintHandler); // 10 SIGUSR1 Signal utilisateur 1
|
||||
signal(SIGSEGV, sigintHandler); // 11 SIGSEGV Violation de mémoire
|
||||
signal(SIGUSR2, sigintHandler); // 12 SIGUSR2 Signal utilisateur 2
|
||||
signal(SIGPIPE, sigintHandler); // 13 SIGPIPE Broken PIPE - Erreur PIPE sans lecteur
|
||||
signal(SIGALRM, sigintHandler); // 14 SIGALRM Alarme horloge
|
||||
signal(SIGTERM, sigintHandler); // 15 SIGTERM Signal de terminaison
|
||||
signal(SIGSTKFLT, sigintHandler); // 16 SIGSTKFLT Stack Fault
|
||||
signal(SIGCHLD, sigintHandler); // 17 SIGCHLD ou SIGCLD modification du statut d'un processus fils
|
||||
signal(SIGCLD, sigintHandler); // 17 SIGCHLD ou SIGCLD modification du statut d'un processus fils
|
||||
signal(SIGCLD, sigintHandler); // 17 SIGCHLD ou SIGCLD modification du statut d'un processus fils
|
||||
signal(SIGCONT, sigintHandler); // 18 SIGCONT Demande de reprise du processus
|
||||
signal(SIGSTOP, sigintHandler); // 19 SIGSTOP Demande de suspension imbloquable
|
||||
signal(SIGSTOP, sigintHandler); // 19 SIGSTOP Demande de suspension imbloquable. En pratique, inutile car toujours intercepté par le noyau...
|
||||
signal(SIGTSTP, sigintHandler); // 20 SIGTSTP Demande de suspension depuis le clavier
|
||||
signal(SIGTTIN, sigintHandler); // 21 SIGTTIN lecture terminal en arrière-plan
|
||||
signal(SIGTTOU, sigintHandler); // 22 SIGTTOU écriture terminal en arrière-plan
|
||||
signal(SIGURG, sigintHandler); // 23 SIGURG évènement urgent sur socket
|
||||
signal(SIGURG, sigintHandler); // 23 SIGURG évènement urgent sur socket
|
||||
signal(SIGXCPU, sigintHandler); // 24 SIGXCPU temps maximum CPU écoulé
|
||||
signal(SIGXFSZ, sigintHandler); // 25 SIGXFSZ taille maximale de fichier atteinte
|
||||
signal(SIGVTALRM, sigintHandler); // 26 SIGVTALRM alarme horloge virtuelle
|
||||
signal(SIGPROF, sigintHandler); // 27 SIGPROF Profiling alarm clock
|
||||
signal(SIGWINCH, sigintHandler); // 28 SIGWINCH changement de taille de fenêtre
|
||||
signal(SIGPOLL, sigintHandler); // 29 SIGPOLL (System V) occurence d'un évènement attendu
|
||||
signal(SIGIO, sigintHandler); // 29 SIGIO (BSD) I/O possible actuellement
|
||||
signal(SIGPWR, sigintHandler); // 30 SIGPWR Power failure restart
|
||||
signal(SIGSYS, sigintHandler); // 31 SIGSYS Erreur d'appel système
|
||||
signal(SIGIO, sigintHandler); // 29 SIGIO (BSD) I/O possible actuellement
|
||||
signal(SIGPWR, sigintHandler); // 30 SIGPWR Power failure restart
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -375,7 +381,7 @@ int8_t init_signaux(void)
|
||||
// Fonction : Handler unique de tous les signaux. Récupére la valeur du signal et met à jour la variable globale correspondante.
|
||||
// ATTENTION : il ne faut PAS faire de printf (ou équivalent) ici car il y a des restrictions dans les signals handlers.
|
||||
// En l'occurence, le traitement en fonction du numéro de signal est fait dans la fonction 'analyse_signal()' ci-dessus.
|
||||
// Reçoit : Rien
|
||||
// Reçoit : Signal reçu
|
||||
// Retour : Rien
|
||||
//==================================================================================================================================================================
|
||||
void sigintHandler(int32_t signal)
|
||||
@@ -385,3 +391,27 @@ void sigintHandler(int32_t signal)
|
||||
}
|
||||
|
||||
|
||||
//==================================================================================================================================================================
|
||||
// Fonction : Handler des signaux d'erreur fatale. Dans ce cas, un 'return' n'est pas acceptable car il ne débouchera, au mieux, que sur la répétition de
|
||||
// l'erreur sans traitement possible.
|
||||
// Reçoit : Signal reçu
|
||||
// Retour : Rien
|
||||
//==================================================================================================================================================================
|
||||
void sigfatalHandler(int32_t signal)
|
||||
{
|
||||
// Uniquement des fonctions "async-signal-safe" ici : pas de sprintf/printf classiques, pas de mutex, pas de malloc. write() sur un fd est sûr :
|
||||
const char msg[] = "/!\\ Signal fatal recu (SIGSEGV/SIGBUS/SIGILL/SIGFPE) - Arret immediat....\n"; // Pas d'accents...
|
||||
write(STDERR_FILENO, msg, sizeof(msg) - 1);
|
||||
|
||||
// Optionnel : capturer une pile d'appel avant de sortir (backtrace() est généralement sûr en pratique même si pas garanti strictement async-signal-safe) :
|
||||
void *tab[20];
|
||||
int n = backtrace(tab, 20);
|
||||
|
||||
char buf[64];
|
||||
int len = sprintf(buf, "La fontion backtrace() a retourne %d frame(s) :\n", n); // Pas d'accents...
|
||||
write(STDERR_FILENO, buf, len);
|
||||
|
||||
if (n > 0) backtrace_symbols_fd(tab, n, STDERR_FILENO);
|
||||
|
||||
_exit(1); // JAMAIS return ici, et de préférence _exit() plutôt que exit() qui appelle des handlers atexit/flush non signal-safe
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user