Développement UNIX en langage C Le C-UNIX

Download Report

Transcript Développement UNIX en langage C Le C-UNIX

Développement C-UNIX
Développement UNIX en langage C
ISR-CSYS-02-001-01
Le C-UNIX
Chapitre 2/15 : Les
ISR-CSYS-02-001-02
signaux
Samir RINAZ © 2005 pour ETNA
Plan de l’UV
Développement C-UNIX
Plan de l’UV ISR-CSYS-02-001:
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ISR-CSYS-02-001-02
01/ malloc()
02/ Les signaux
03/ Les processus et le job control
04/ pipe / redirection
05/ Les devices
06/ Gestion des entrée/sorties avancées
07/ Gestion des terminaux
08/ mmap()
09/ Les threads
10/ Communication interprocessus
11/ Communication interprocessus avancée
12/ Le format elf
13/ Le file systeme /proc
14/ L’assembleur in-line
15/ Sécurité des développement en C-UNIX
Samir RINAZ © 2005 pour ETNA
Généralités sur les signaux
Développement C-UNIX
• Les signaux sont envoyé par le kernel
pour indiquer aux processus certains
messages. Ceux-ci pouvant émaner
du kernel lui-même ou d’un autre
processus.
• Vous n’avez rien à faire pour que vos
programme reçoivent les signaux.
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Exemples de signaux
Développement C-UNIX
Nom/Macro
Action par défaut
Origine du nom
SIGHUP
Mort
Hangup (raccrocher)
SIGINT
Mort
Interrupt
SIGQUIT
Core
SIGILL
Core
SIGTRAP
Core
SIGABRT
Core
Abort
SIGFPE
Core
Floating-point exception
SIGKILL
Mort
SIGBUS
Core
Bus error
SIGSEGV
Core
Segmentation violation
SIGSYS
Core
Syscall
SIGPIPE
Mort
SIGALRM
Mort
Alarm
SIGTERM
Mort
Terminate
ISR-CSYS-02-001-02
Illegal instruction
Samir RINAZ © 2005 pour ETNA
Exemples de signaux (suite)
Développement C-UNIX
Nom/Macro
Action par défaut
Origine du nom
SIGURG
Ignoré
SIGSTOP
Arrêt
SIGTSTP
Arrêt
Terminal stop
SIGCONT
Ignoré
Continue
SIGCHLD
Ignoré
Child
SIGTTIN
Arrêt
Tty input
SIGTTOU
Arrêt
Tty output
SIGIO
Ignoré
Input/output
SIGXCPU
Mort
Exceed cpu time
SIGXFSZ
Mort
Exceed file size
SIGVTALRM
Mort
Virtual time alarm
SIGPROF
Mort
Profiling timer
SIGWINCH
Ignoré
Window size change
SIGUSR1
Mort
User defined signal 1
SIGUSR2
Mort
User defined signal 2
ISR-CSYS-02-001-02
Urgent
Samir RINAZ © 2005 pour ETNA
Le « meilleur » exemple de signal
Développement C-UNIX
• Le meilleur exemple de signal (puisque connu de
tous) est le SIGSEGV, en effet, il est envoyé pas le
kernel lorsqu’un processus accède à un espace
mémoire auquel il ne devrait pas accéder.
• Mettre en évidence ceci est simple :
int
{
int
main()
*a;
a = 0;
*a = 42;
}
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Comment faire ce que l’on veut d’un signal
Développement C-UNIX
• Chaque processus possède une structure
contenant les actions à prendre lors de la
réception des signaux (dans la structure u)
et un masque de signaux. Ce dernier définit
si tel ou tel signal est bloqué.
• Certains appels système sont mis à la
disposition des utilisateurs pour modifier le
comportement lors de la réception des
signaux: les ignorer (si possible), les bloquer
(!= d'ignorer) les rediriger sur un « handler »
(une fonction qui ferra ce que nécessaire
lorsque le signal en question sera reçu),
remettre l'action par défaut.
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Les appels système mis en jeux
Développement C-UNIX
• Kill(2) envoi un signal à un ou plusieur
processus
• Signal(3), sigaction(2) permet de
redéfinir l’action menée lorsqu’un
signal est reçu. On n’a plus le
comportement par défaut.
• Pause(3), sigsuspend(2) qui
permettent d’attendre un signal.
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Kill()
Développement C-UNIX
• Synopsis :
#include <signal.h>
int kill(pid_t pid, int sig);
• Permet d’envoyer le signal
correspondant à l’entier sig au
processus correspondant à l’identifiant
de processus pid.
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Signal(3), sigaction(2)
Développement C-UNIX
•Synopsis :
#include <signal.h>
void (*signal(int sig, void (*handler)());)()
struct sigaction
{
void
sigset_t
int
};
int
(*sa_handler)();
sa_mask;
sa_flags;
sigaction(int sig, struct sigaction *act, struct sigaction *oact);
struct sigvec
{
void
int
int
};
int
(*sv_handler)();
sv_mask;
sv_flags;
sigvec(int sig, struct sigvec *vec, struct sigvec *ovec)
L'interface la plus simple pour détourner un signal reste la fonction
signal(3). Elle utilise en interne sigaction(2) avec le flag SA_RESTART (à
moins que le signal n'ai été spécifié explicitement comme interrompu
avec siginterrupt(3)). Sur les vieux systèmes, elle utilise sigvec(2) avec
le flag SV_INTERRUPT non positionné.
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Pause(3), sigsuspend(2)
Développement C-UNIX
• Synopsis:
#include <signal.h>
int pause();
int sigsuspend(sigset_t *sigmask);
• Cet appel système endort le processus
jusqu'à réception d'un signal en utilisant de
manière temporaire le masque de signaux
passé en paramètre. À réception de l’un
des signaux marqué par le masque, le
processus reprend son exécution.
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA
Conclusion
Développement C-UNIX
• A partir de ce cours, nous allons vous
demander de mettre en place une
communication interprocessus
rudimentaire à base de signaux
(SIGUSR1 et SIGUSR2)
• Pour la suite, le prochain cours est
« Les processus et le job control ».
ISR-CSYS-02-001-02
Samir RINAZ © 2005 pour ETNA