a fait quelqu'un qui sait comment utiliser le sigaltstack dans un programme de gestionnaire de signal réel, un code simple mais complet peut être une aide précieuse pour moi! merci d'avance!comment utiliser "sigaltstack" dans le programme gestionnaire de signal?
Répondre
Voici un exemple de programme minimal qui utilise sigaltstack
pour intercepter la récursion infinie. Si vous mettez en commentaire l'appel sigaltstack
ou le flag SA_ONSTACK
, le gestionnaire de signal ne pourra pas s'exécuter car il ne reste plus de pile et le programme ne fonctionnera plus.
#define _XOPEN_SOURCE 700
#include <signal.h>
#include <unistd.h>
void handler(int sig)
{
write(2, "stack overflow\n", 15);
_exit(1);
}
unsigned infinite_recursion(unsigned x) {
return infinite_recursion(x)+1;
}
int main()
{
static char stack[SIGSTKSZ];
stack_t ss = {
.ss_size = SIGSTKSZ,
.ss_sp = stack,
};
struct sigaction sa = {
.sa_handler = handler,
.sa_flags = SA_ONSTACK
};
sigaltstack(&ss, 0);
sigfillset(&sa.sa_mask);
sigaction(SIGSEGV, &sa, 0);
infinite_recursion(0);
}
Une utilisation plus sophistiquée pourrait en fait effectuer siglongjmp
sauter du gestionnaire de signal et à un point où l'on peut éviter la récursion infinie. Cela n'est pas valide si les appels de bibliothèque async-signal-unsafe sont utilisés, ou si vos données peuvent être laissées dans un état non sécurisé/irrécupérable, mais si vous effectuez des calculs arithmétiques purs, cela peut être valide. Une meilleure tâche pour le gestionnaire de signal serait peut-être d'effectuer un vidage d'urgence de toutes les données valables/critiques qui n'étaient pas déjà enregistrées sur le disque. Cela peut être difficile si vous ne pouvez pas appeler des fonctions asynchrones, ce qui est généralement possible si vous y mettez un peu d'effort.
ce code ne fonctionne pas .... il m'a donné un défaut de sementation –
Cela fonctionne bien pour moi (après avoir corrigé la faute de frappe). Incidemment, avec l'optimisation activée, gcc génère une boucle infinie plutôt que la récursivité pour la fonction et ne déborde donc jamais la pile. Avec '-O0', le gestionnaire de signal fonctionne comme prévu. –
J'ai essayé avec -O0 comme tu l'as dit mais ça me donne encore un défaut de sementation. Peut-il s'agir de la version gcc? –
- 1. Utiliser le gestionnaire de signal pour revenir d'une fonction
- 2. Gestionnaire de signal, python
- 3. Gestionnaire de signal dans le module XS
- 4. Utilisation de données longues dans le gestionnaire de signal.
- 5. sem_wait et gestionnaire de signal
- 6. Programme reçu le signal SIGABRT
- 7. Le signal de minuterie POSIX n'est pas bloqué dans le gestionnaire de signal
- 8. Programme reçu le signal: "EXC_BAD_ACCESS"
- 9. Perl 5.10.0 Gestionnaire de signal Problème
- 10. fonction non réentrante dans le gestionnaire de signal?
- 11. (Pourquoi) relance-t-il le gestionnaire de signal?
- 12. Le gestionnaire de signal ne verra pas la variable globale
- 13. Retour d'un gestionnaire de signal et signal masqué
- 14. Programme de débogage reçu le signal "SIGABRT"
- 15. Comment écrire un gestionnaire de signal button_press_event dans Vala?
- 16. Vérification du gestionnaire de signal installé
- 17. linux/glibc. Puis-je utiliser fprintf dans le gestionnaire de signal?
- 18. Comment déboguer un programme avec un gestionnaire de signal pour SIGSEGV
- 19. Lire des données partagées dans un gestionnaire de signal
- 20. Conditions de concurrence dans mon gestionnaire de signal POSIX
- 21. Malheurs du signal Python: Le gestionnaire SIGQUIT retarde l'exécution si SIGQUIT est reçu pendant l'exécution d'un autre gestionnaire de signal?
- 22. le programme reçoit le signal "SIGABRT"
- 23. portage gestionnaire de signal OS-9
- 24. Programme signal reçu: EXC_BAD_ACCESS
- 25. Programme signal reçu: « 0 »
- 26. programme de gestionnaire
- 27. programme Twisted et le signal TERM
- 28. Programme reçu le signal EXC BAD ACCESS
- 29. thread1: Programme reçu le signal "EXC_bad_Access"
- 30. Erreur Ipad: 'Programme reçu le signal EXC_BAD_ACCESS'
//, Cela pourrait probablement utiliser une amélioration de la mise en forme. Avez-vous déjà essayé quelque chose? Cela a-t-il fonctionné pour vous? –