Module programmation Unix

Transcription

Module programmation Unix
Présentation du module
Processus
Signaux
Tubes
Conclusion
Module programmation Unix
Sébastien Le Maguer
EII 1 (2011/2012)
Module programmation Unix
1 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Plan
1
Présentation du module
2
Processus
3
Signaux
4
Tubes
5
Conclusion
Module programmation Unix
2 / 39
Présentation du module
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Présentation du module - Objectifs
Pré-requis
Module utilisation Unix
Module algorithmique/C
Ce que nous allons voir
Programmation utilisant le système Unix
Nous n’allons pas programmer le système !
Module programmation Unix
4 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Présentation du module - Déroulement
Première année
Processus
Signaux
Tubes
Deuxième année
Threads
IPC
Module programmation Unix
5 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Présentation du module - Déroulement
4h de CM (présentation des concepts)
Pas de détails sur les primitives ⇒ pages de manuel
6h de TP (application des concepts)
Évaluation : DS de 1h
Module programmation Unix
6 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Présentation du module - Bibliographie
Christophe Blaess.
Développement système sous Linux : ordonnancement, multi-tâche,
gestion meémoire, communications, programmation reéseau.
Eyrolles, Paris, 2011.
Biran Kernighan and Pike Rob.
The UNIX programming environment.
Prentice-hall software series, 1978.
Various.
http://www.gnu.org/software/libc/manual/html_node/
index.html.
Various.
Linux man page.
http://www.delafond.org/traducmanfr/.
man command.
Module programmation Unix
7 / 39
Processus
Présentation du module
Processus
Signaux
Tubes
Conclusion
Définition et caractéristiques: Qu’est ce qu’un
processus
Définition
processus = unité d’exécution du système
Exemple de processus = programme/commande
“cd”, “ls”, . . .
“login”, . . .
“firefox”, . . .
...
Mais pas que :
Le serveur Web créé des processus
...
Module programmation Unix
9 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Définition et caractéristiques: Propriétés
Constitution d’un processus
identifiant (pid)
espace mémoire propre (mémoire virtuelle)
code
données
diverses tables (descripteurs, signaux,. . . )
Propriétaire (user/group) + droits spécifiques
Concrètement :
Un proc. = un répertoire /proc/ < PID >
Exemple de répertoire proc :
attr
mounts
autogroup
mountstats
auxv
net
cgroup
numa_maps
clear_refs
oom_adj
cmdline
oom_score
comm
oom_score_adj
coredump_filter
pagemap
cpuset
personality
cwd
root
environ
sched
exe
schedstat
fd
sessionid
fdinfo
smaps
io
stack
latency
stat
limits
statm
loginuid
status
maps
syscall
mem
task
mountinfo
wchan
Module programmation Unix
10 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
États d’un processus: Graphe d’états d’un
processus
Sommeil
Attente
d’un évènement
Signal
fork
Prêt
Ordonance.
exit
Exécution
Zombie
Lecture code retour
SIGTOP
SIGCONT
Arrêté
Module programmation Unix
11 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Création d’un processus
Utilisation de la primitive fork :
pid_t fork ( void );
Ce qui se passe :
Père
code+données
propriétés
(droits,. . . )
Fils
code+données
fork
propriétés
(droits,. . . )
Module programmation Unix
12 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Création d’un processus Exemple
pid_t pid = fork ();
switch ( pid )
{
case -1:
fprintf ( stderr , " impossible de creer le processus " );
exit ( EXIT_FAILURE );
case 0:
printf ( " Je suis le fils " );
exit ( EXIT_SUCCESS );
default :
printf ( " Je suis le pere " );
waitpid ( pid );
}
Module programmation Unix
13 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Attente d’un processus
Attente d’un processus donné
pid_t waitpid ( pid_t pid , int * status , int options );
Attente de tous les processus fils !
pid_t wait ( int * status );
status permet de récupérer le code renvoyé par le fils
Module programmation Unix
14 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Problème : le recouvrement: Exécution d’un
programme externe
Basée sur la primitive execlp
Nécessite de donner le chemin complet !
“which command” pour connaitre le chemin complet de command
Exemple d’utilisation :
Problème execlp écrase la mémoire du processus mais garde
l’identité
⇒ RECOUVREMENT
Solution = créer un processus fils qui sert d’hôte
Module programmation Unix
15 / 39
Signaux
Présentation du module
Processus
Signaux
Tubes
Conclusion
Définition et caractéristiques: Qu’est ce qu’un
signal
Définition
Un signal est une notification asynchrone envoyée par le noyau à
un processus
Limitations :
Pas d’accusé de réception
Impossible de savoir qui a émis le signal
Module programmation Unix
17 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Définition et caractéristiques: Liste des signaux
les plus connus sous Unix
(/usr/include/bits/signum.h, man 7 signal)
Nom
SIGHUP
Id.
1
Action par défaut
Term
SIGINT
SIGQUIT
SIGILL
SIGABRT
SIGFPE
SIGKILL
SIGSEGV
SIGPIPE
SIGALRM
SIGTERM
SIGUSR1
SIGUSR2
SIGCHLD
SIGCONT
SIGSTOP
SIGTSTP
SIGTTIN
SIGTTOU
2
3
4
6
8
9
11
13
14
15
30,10,16
31,12,17
20,17,18
19,18,25
17,19,23
18,20,24
21,21,26
22,22,27
Term
Core
Core
Core
Core
Term
Core
Term
Term
Term
Term
Term
Ign
Cont
Stop
Stop
Stop
Stop
Sens
Raccrochement (déconnexion) sur terminal de contrôle,
ou mort du processus de contrôle
Interruption clavier (Ctrl+c)
Demande ’Quitter’ depuis le clavier
Instruction illégale
Signal d’arrêt depuis abort(3)
Erreur mathématique virgule flottante
Signal ’KILL’
Référence mémoire invalide
Écriture dans un tube sans lecteur
Temporisation alarm(2) écoulée
Signal de fin
Signal utilisateur 1
Signal utilisateur 2
Fils arrêté ou terminé
Continuer si arrêté
Arrêt du processus
Stop invoqué depuis tty
Lecture sur tty en arrière-plan
Écriture sur tty en arrière-plan
Module programmation Unix
18 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Résumé des manipulations
Schéma classique
Envoi un signal au processus courant + ALARME !
Proc. A
KERNEL
Proc B
Module programmation Unix
19 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Résumé des manipulations
Schéma classique
Envoi un signal au processus courant + ALARME !
demande signal à B
Proc. A
KERNEL
Proc B
envoi signal à B
Module programmation Unix
19 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Résumé des manipulations
Schéma classique
Envoi un signal au processus courant + ALARME !
demande signal à A
Proc. A
KERNEL
envoi signal à A
Proc B
Module programmation Unix
19 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Émission
Envoyé par le noyau mais la demande peut venir de :
D’autres processus (kill)
Le processus lui même (exceptions : division par zéro, . . . )
Le noyau (Alarme, . . . )
Basée sur la primitive kill :
int kill ( pid_t pid , int sig );
Alias pour le processus courant raise :
int raise ( int sig );
équivalent à
int kill ( getpid () , int sig );
Module programmation Unix
20 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Réception - signal
Ne fonctionne pas pour SIGKILL, SIGCONT, SIGSTOP
Basée sur la primitive signal
sighandler_t signal ( int signum , sighandler_t handler );
handler = pointeur sur fonction :
typedef void (* sighandler_t )( int );
Deux handler particuliers :
SIG DFL = comportement par défaut
SIG IGN = ignorer le signal
Module programmation Unix
21 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Réception - sigaction
Ne fonctionne pas pour SIGKILL, SIGCONT, SIGSTOP
Basée sur la primitive sigaction
int sigaction ( int signum , const struct sigaction * act ,
struct sigaction * oldact );
Nécessite plus d’informations
struct sigaction {
void
(* sa_handler )( int );
void
(* sa_sigaction )( int , siginfo_t * , void *);
sigset_t
sa_mask ;
int
sa_flags ;
void
(* sa_restorer )( void );
};
Différences avec signal :
signal est standard, sigaction non ! Néanmoins...
signal réinitialise le handler ! (⇒ course entre signaux)
sigaction possède plus d’options
Module programmation Unix
22 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Réception - sigaction
signal a eu un comportement qui a évolué au cours du temps
(manpage)
utiliser sigaction plutôt que signal
Course (ré-initialisation du handler) :
deux signaux émis presque simultanément
le second émis avant la réinstallation du handler ⇒ action par
défaut au lieu de l’action voulue (Système V)
cela semble avoir évolué avec la glibc2 ⇒ le second signal est
bloqué (BSD)
Module programmation Unix
23 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Attente/Alarme
Attente, processus endormi jusqu’à réception (ne fonctionne pas
pour SIGKILL, SIGCONT, SIGSTOP) :
De n’importe quel signal
int pause ( void );
De signaux précis (fonctionnement par mask)
int sigsuspend ( const sigset_t * mask );
Alarme, émission du signal SIGALRM au bout d’un certain temps
(processus courant)
unsigned int alarm ( unsigned int seconds );
Module programmation Unix
24 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Exemple complet avec signal
(sigaction ⇒ TP)
int pid = 0;
void handler_fils ( int signum )
{
if ( signum == SIGALRM )
{
printf ( " % d - recu SIGALRM \ n " , getpid ());
kill ( getppid () , SIGINT );
pause ();
}
else if ( signum == SIGKILL )
{
printf ( " % d - kill \ n " , getpid ());
}
}
Module programmation Unix
25 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Exemple complet avec signal
(sigaction ⇒ TP)
void handler_pere ( int signum )
{
if ( signum == SIGINT )
{
printf ( " % d - recu SIGINT \ n " , getpid ());
kill ( pid , SIGKILL );
}
else if ( signum == SIGALRM )
{
printf ( " % d - recu SIGALRM \ n " , getpid ());
kill ( pid , SIGALRM );
}
else if ( signum == SIGCHLD )
{
printf ( " % d - recu SIGCHLD \ n " , getpid ());
}
}
Module programmation Unix
26 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Exemple complet avec signal
(sigaction ⇒ TP)
int main ( int argc , const char ** argv )
{
pid = fork ();
if ( pid == 0)
{
signal ( SIGALRM , handler_fils );
pause ();
}
else if ( pid > 0)
{
alarm (2);
signal ( SIGINT , handler_pere );
signal ( SIGALRM , handler_pere );
signal ( SIGCHLD , handler_pere );
wait ( pid );
}
return EXIT_SUCCESS ;
}
Module programmation Unix
27 / 39
Tubes
Présentation du module
Processus
Signaux
Tubes
Conclusion
Définition et caractéristiques: Qu’est qu’un tube
Permet de programmer le “|” (ls | grep...)
2 types de tube :
Anonyme
Nommé
Mode FIFO + Flots de données
Schéma d’un tube
Père
Fils
in
in
out
out
STDOUT
STDIN
Module programmation Unix
29 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Définition et caractéristiques: Qu’est qu’un tube
Permet de programmer le “|” (ls | grep...)
2 types de tube :
Anonyme
Nommé
Mode FIFO + Flots de données
Schéma d’un tube
Tube (pipe)
Père
Fils
in
in
out
out
Module programmation Unix
29 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Pré-requis : re-direction des IO
Permet d’effectuer une dérivation
Basée sur la primitive dup2 (dup est obsolète !)
int dup2 ( int oldfd , int newfd );
Liens avec les tubes
théorie = re-direction de la sortie d’un processus vers l’entrée d’un
autre
pratique = tube plus compliqué qu’une simple re-direction
Exemple (exercice 1 du TP sur les tubes)
Module programmation Unix
30 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Création
Basé sur la primitive pipe
int pipe2 ( int pipefd [2]);
Limitation : repose sur le mécanisme d’héritage
⇒ Lien de parenté entre les processus relié par le tube
⇒ Créer le tube avant la création du proc. fils
⇒ Ne permet de communiquer que du père vers le fils
Module programmation Unix
31 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Principe de fonctionnement d’un
tube
1
Créer le tube
2
Créer le fils
3
Pour chaque processus
Dans le fils
1
2
3
4
Fermeture du descripteur d’écriture
Lecture
Fermeture du descripteur de lecture
Quitter
Dans le père
1
2
3
4
5
Fermeture du descripteur de lecture
Écriture
Fermeture du descripteur d’écriture
Attendre le fils
Quitter
Module programmation Unix
32 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Écriture/Lecture
Fonctionne comme pour un fichier !
Écriture
Basé sur la primitive write
ssize_t write ( int fd , const void * buf , size_t count );
Lecture
Basé sur la primitive read
ssize_t read ( int fd , void * buf , size_t count );
Module programmation Unix
33 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Fermeture/Destruction
Fonctionne comme pour un fichier !
Fermeture basée sur la primitive close
int close ( int fd );
Destruction effective du tube lorsqu’il n’est plus référencé
Module programmation Unix
34 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Exemple minimal
# define SIZE 30
int main ( int argc , const char ** argv )
{
int fd [2];
pid_t pid ;
char * buffer = NULL ;
buffer = ( char *) malloc ( SIZE * sizeof ( char ));
if ( buffer == NULL )
{
perror ( " erreur allocation buffer " );
return EXIT_FAILURE ;
}
if ( pipe ( fd ) < 0)
{
perror ( " erreur creation pipe " );
return EXIT_FAILURE ;
}
Module programmation Unix
35 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
Manipulation: Exemple minimal
switch ( pid = fork ())
{
case -1:
perror ( " erreur creation process " );
return EXIT_FAILURE ;
case 0:
close ( fd [1]);
read ( fd [0] , buffer , SIZE );
printf ( " Message recu = % s \ n " , buffer );
close ( fd [0]);
exit ( EXIT_SUCCESS );
default :
close ( fd [0]);
write ( fd [1] , " Luke , je suis ton pere !\0 " , SIZE );
close ( fd [1]);
waitpid ( pid );
}
Module programmation Unix
return EXIT_SUCCESS ;
36 / 39
Conclusion
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Conclusion - Bilan
Ce dont vous devriez être capable...
Comprendre les bases des processus et en créer
Émettre et recevoir des signaux et comprendre leur utilité
Re-diriger les entrées/sorties et communiquer via des tubes
Il ne s’agit que d’une introduction - Nous n’avons pas vu
Les techniques d’ordonnancement
Les IPC (EII 2)
...
Module programmation Unix
38 / 39
Présentation du module
Processus
Signaux
Tubes
Conclusion
: Conclusion - Pour aller plus loin...
Implémenter, tester, bref APPLIQUER !
Le système est sécurisé !
Vous acquerrez de l’expérience et donc une intuition !
Regarder l’implémentation des primitives :
Compliqué.....
....mais formateur
Module programmation Unix
39 / 39