# R3.05 # Programmation système 2024 Pomme Pompeani CC-BY-SA-NC --- ## Interruptions ## Appels Systèmes ## Signaux --- ## Interruptions Interruption d'un processus en cours d'exécution ---- ## Sources d'interruptions - Entrées / Sorties - Erreurs à l'exécution (division par zéro) - Exceptions de sécurité (segmentation fault) - Horloge - Timer - Signaux reçus → Le flot d'exécution n'est plus séquentiel ← ---- ## Fonctionnement général Proche d'un appel de fonction
Différences : - Procédures par défaut à des adresses prédéfinies - Traitement spécial des interruptions ---- ## Caractéristiques des interruptions #### Internes - Déclenchées par le processus - Involontairement (division par zéro, segfault) - Volontairement ("exceptions" logicielles, envoi de signal) ---- ## Caractéristiques des interruptions #### Externes - Déclenchées par l'environnement du processus - Entrées / Sorties - Timers - Signaux reçus ---- ## Caractéristiques des interruptions #### Filtrables On peut en ignorer certaines #### Traitement modifiable On peut décider ce qu'on en fait ---- ## Priorités des interruptions - Certaines plus prioritaires que d'autres - Une seconde interruption peut advenir pendant le traitement d'une première
---- ## Procédure générale
--- ## Appels Systèmes ---- ## Appels Systèmes - Très similaires au traitement d'une interruption - Le noyau prend la main 🖐️ - Le CPU passe en mode privilégié - Masque certaines interruptions - Processus potentiellement mis en attente 😴 - Entrées / Sorties.. - Le noyau exécute un autre processus ---- ## Exemple ```c #include
#include
int main() { pid_t p = getpid(); printf("%d\n", p); } ``` ```bash gcc ~/pid.c -o ~/pid ``` ---- Entrée en mode noyau
---- Retour en mode utilisateur
--- ## Signaux Mécanisme pour signaler les interruptions aux processus `man 7 signal` ---- #### Principaux signaux -
Kernel
-
CPU
-
User
---- #### Principaux signaux -
SIGSEGV
: Segment° fault (=accès mémoire interdit) -
SIGCHLD
: Chgmnt d'un enfant (mort et réveil 🧟) -
SIGILL
: Instruction illégale -
SIGFPE
: Floating Point Exception (=/0) -
SIGTSTP
: Pause demandée au clavier (Ctrl-Z) -
SIGINT
: Arrêt demandé au clavier (Ctrl-C) -
SIGUSR1
: User-defined -
SIGUSR2
: User-defined -
SIGKILL
: Mort imminente 💀 -
SIGSTOP
: Pause ---- #### Actions par défaut -
SIGSEGV
: Fin du processus -
SIGCHLD
: Ignoré -
SIGILL
: Fin du processus -
SIGFPE
: Fin du processus -
SIGTSTP
: Processus mis en pause -
SIGINT
: Fin du processus -
SIGUSR1
: Ignoré -
SIGUSR2
: Ignoré -
SIGKILL
: Fin du processus -
SIGSTOP
: Processus mis en pause ---- ## Filtrage des signaux Il est possible de filter (bloquer) les signaux reçus Appel système : `sigprocmask` Deux signaux non-filtrables : - SIGKILL - SIGSTOP ---- ## Traitement des signaux Appel système : `sigaction` - Redéfinit l'action à effectuer ```c int sigaction(int signum, const struct sigaction *newaction, struct sigaction *oldaction); ``` ---- ## Envoi de signaux (C) Appel système : `kill` ```c int kill(int signum, const struct sigaction *newaction, struct sigaction *oldaction); ``` ---- ## Envoi de signaux (Shell) ```bash $ kill
# default signal: SIGTERM $ kill -SIGKILL
$ kill -SIGUSR1
$ ... $ pgrep
$ pkill
# default signal: SIGTERM $ pkill -SIGUSR1
$ ... ``` ---- ## Exemple `sigsegv.c` ---- ## Autre exemple `vim`