Vous êtes sur la page 1sur 9

Plan

Le processus : vue utilisateur Les processus : principes dimpl ementation Le bloc de contr ole Le contexte dun processus Appels syst` emes POSIX Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Les processus : fork, exit et wait


2

Luigi Santocanale
Laboratoire dInformatique Fondamentale, Centre de Math ematiques et Informatique, 39, rue Joliot-Curie - F-13453 Marseille

3 octobre 2005

Luigi Santocanale

Le processus

Luigi Santocanale

Le processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le bloc de contr ole Le contexte dun processus

Arborescence des processus


[lsantoca@localhost lecture3]$ ps -o "%p %P %c" PID PPID COMMAND 2802 2799 bash 3188 2802 emacs 1:init OOO OOO  3290 2802 ps O 
  OOO OOO O ...

Impl ementation des processus

Un processus comporte: un espace dadressage, le bloc du contr ole du processus, d ecompos e en :


entr ee dans la table des processus, une zone u, allou e dynamiquement ` a la cr eation du processus.

3188:emacs

   

2802:bash ?

son contexte.

?? ?? ??

3290:ps

Luigi Santocanale

Le processus

Luigi Santocanale

Le processus

La table des processus

(Revuz 1998)

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le bloc de contr ole Le contexte dun processus

La table des processus


Tableau de structures proc, voir sys/proc.h : S ( etat) adresse zone u adresses en m emoire PID (ID du processus), PPID (ID du p` ere) ev enement en attente (si endormi) NI (valeur nice), priorit es ensemble des signaux pendants temporisation, . . .

Luigi Santocanale

Le processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le bloc de contr ole Le contexte dun processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le bloc de contr ole Le contexte dun processus

La zone u
Structure user, voir sys/user.h : pointeur sur lentr ee dans la table des processus RUSER, EUSER, RGROUP, EGROUP consommation CPU masque des signaux terminal de contr ole errno . et / table des descripteurs ouverts masque cr eation . . .

Acces au bloc de contr ole par la commande ps

[lsantoca@localhost lecture3]$ ps -eo > rgroup,egroup,s,ni | grep ps cupsd 2053 1 root cups-polld 193.5 2244 2053 lp cups-polld 193.5 2245 2053 lp cups-polld 192.1 2246 2053 lp kdeinit: dcopser 3254 1 lsantoca man ps 3664 3317 lsantoca ps -eo cmd,pid,p 3697 3329 lsantoca

cmd,pid,ppid,ruser,euser,\ root lp lp lp lsantoca lsantoca lsantoca root sys sys sys lsantoca lsantoca lsantoca root sys sys sys lsantoca lsantoca lsantoca S S S S S S R 0 0 0 0 0 0 0

Luigi Santocanale

Le processus

Luigi Santocanale

Le processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le bloc de contr ole Le contexte dun processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Le bloc de contr ole Le contexte dun processus

Contexte dun processus


Ensemble des donn ees qui permettent de reprendre lex ecution dun processus interrompu. mot d etat, contexte de lunit e centrale :
accumulateur, registre dinstruction et compteur dinstruction, registres d etat du processeur, registres d etats du processus.

Commutation du mot d etat

Il sav` ere ` a la r eception/acquittement dune interruption. Trois types dinterruptions : externe : horloge, disque, console, p eriph erique., d eroutement : erreur du processeur, division par z ero, page fault, appel syst` eme.

etat du processus, variables globales statiques dynamiques, entr ee dans la table du processus, zone u, piles user et system, zones de codes et de donn ees.
Luigi Santocanale Le processus 11

Luigi Santocanale

Le processus

12

Traitement des interruptions fork

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

#include <unistd.h> pid t fork(void );

Retourne : -1, si erreur, 0, au ls, pid du ls, retourn e au p` ere.

Sommaire : Clonation du processus

Luigi Santocanale

Le processus

15

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Naissance des processus

D etails
Dans un appel ` a la primitive fork :

3890:commande ? TT
    

?? TTTT TTTT ?? TTTT ?? T ?? ... 4105:commande

TOUS les donn ees concernant le processus sont dupliqu ees :


espace dadressage, bloc de contr ole du processus.

` LEXCEPTION de : A
la r egion texte peut etre partag e entre les deux processus, le PID et le PPID sont mis ` a jour.

Luigi Santocanale

Le processus

16

Luigi Santocanale

Le processus

17

Algorithme fork

(Bach 1989)

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

fork
#include <unistd.h> pid t fork(void ); Retourne : -1, si erreur, 0, au ls, pid du ls, retourn e au p` ere. Sommaire : Clonation du processus

Luigi Santocanale

Le processus

19

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Programme : exfork.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 : : : : : : : : : : : : : : : : : : : : : : : #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(void) { pid_t pid; switch (pid = fork()) { case -1: perror("fork"); return -1; case 0: printf("Je suis le fils et mon pid est %d.\n", getpid()); return 0; default: printf("Je suis le p` ere, " "mon pid est %d, jai un fils avec pid %d.\n", getpid(), pid); return 0; } }
Luigi Santocanale Le processus 20

Programme : exfork2.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 : : : : : : : : : : : : : : : : : : : : #include #include #include #include <stdio.h> <stdlib.h> <unistd.h> <sys/types.h>

int main(void) { pid_t pid; if ((pid = fork()) == -1) { perror("fork"); exit(EXIT_FAILURE); } if (pid == 0) code_du_fils(); else code_du_pere(); }
Luigi Santocanale Le processus 21

/* Erreur */

/* Si fils */ /* Si p` ere */

Algorithme exit

(Bach 1989)

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

exit, atexit, abort, exit


#include <stdlib.h> #include <unistd.h> void exit(int status ); Sommaire : Fermeture des chiers ouverts, terminaison normale avec code status : ce param` etre est re cu par le p` ere ` a laide de la primitive wait. void exit(int status ); Sommaire : Ex ecute les fonctions enregistr ees par atexit, vide les tampons de la biblioth` eque standard, ferme les chiers ouverts avec etre status. fopen, appel ` a la primitive exit avec param` int atexit(void (*valeur)(void) ); void abort(void ); Sommaire : Vide les tampons de la biblioth` eque standard, terminaison anormale.
Luigi Santocanale Le processus

24

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Programme : exexit.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 : : : : : : : : : : : : : : : : : : #include <stdlib.h> #include <stdio.h> #include <unistd.h> void terminer(void) { printf("\nAppel a ` la fonction terminer "); } int main(int argc, char *argv[]) { atexit(terminer); printf("\nUtilisation de \"%s\" pour sortir :", argv[1]); printf("\nContenu du tampon a ` vider "); SORTIE; }
Luigi Santocanale Le processus 25

Session : exit

[lsantoca@localhost lecture4]$ for i in "exit(0)" \ > "abort()" "_exit(0)";\ > do gcc -Wall -pedantic -DSORTIE=$i exexit.c;\ > a.out $i; done Utilisation de "exit(0)" pour sortir : Contenu du tampon a ` vider Appel a ` la fonction terminer Utilisation de "abort()" pour sortir : Contenu du tampon a ` vider Aborted Utilisation de "_exit(0)" pour sortir :

Luigi Santocanale

Le processus

26

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Algorithme wait

(Bach 1989)

Mort des processus, synchronisation


1:init 4

44 44 44  44 p` ere 44 44 44 44 44 44 44  

gf 1

...

gf n

Luigi Santocanale

Le processus

28

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

wait, waitpid
#include <sys/types.h> #include <sys/wait.h.h> pid t wait(int * ptr ); ptr : un adresse ` a remplir avec le code renvoy e par le ls. Retourne : pid du ls, o` u -1 si echec. pid t waitpid(pid t pid , int * ptr , int opts ); pid : > 0 : un processus 0 : tous les processus du groupe -1 : tous les ls <-1 : tous les processus dans le groupe |pid| ptr : adresse ` a remplir opts : |de : WNOHANG : sans etre bloqu e WUNTRACED : si le processus est stopp e Retourne : pid du processus pris en compte, -1 erreur, 0 echec avec option WNOHANG
Luigi Santocanale Le processus 30

D ecodage de la valeur de sortie du ls


Macros d enies dans wait.h : WIFEXITED(code) : vrai si le processus sest termin e de fa con normale
WEXITSTATUS(code) : le code de sortie, c.` a.d. status dans exit(status).

WIFSIGNALED(code): vrai si le processus sest termin e` a cause dun signal (par exemple, un CTRL-C)
WTERMSIG(code), le signal qui a provoqu e la terminaison.

WIFSTOPPED(code) : vrai si le processus est arr et e` a cause dun signal (primitive waitpid avec option WUNTRACED)
WSTOPSIG(code), le signal qui a provoqu e l arr et.
Luigi Santocanale Le processus 31

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Programme : exwait.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 : : : : : : : : : : : : : : : : : : : : : : : : : : #include #include #include #include #include <wait.h> <stdio.h> <unistd.h> <stdlib.h> <time.h>

Programme : exwait.c
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
Le processus 32

void fils(void); void pere(pid_t pid); int main(void) { pid_t pid; srand(time(NULL)); switch (pid = fork()) { case -1: exit(EXIT_FAILURE); case 0: fils(); default: pere(pid); } exit(EXIT_SUCCESS); }

/* Erreur */

: : : : : : : : : : : : : : : : : : : : : : : :

void fils(void) { int signum = rand() % (NSIG - 1) + 1; printf("Signal choisi : %d.\n", signum); kill(getpid(), signum); exit(signum); } void pere(pid_t pid1) { int codesortie; pid_t pid2 = waitpid(pid1, &codesortie, WUNTRACED); if (WIFSIGNALED(codesortie)) printf("Le fils %d sest termin e a ` cause du signal %d.\n", pid2, WTERMSIG(codesortie)); if (WIFEXITED(codesortie)) printf("Le fils %d sest termin e normalement" " avec code sortie %d.\n", pid2, WEXITSTATUS(codesortie)); if (WIFSTOPPED(codesortie)) printf("Le fils %d est stopp e" " avec code %d.\n", pid2, WSTOPSIG(codesortie)); exit(EXIT_SUCCESS); }
Luigi Santocanale Le processus 33

Luigi Santocanale

Etats dun processus : deuxi` eme approximation

(Revuz 1998)

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

ID du processus, ID du processus p` ere


#include <unistd.h> #include <sys/types.h> pid t getpid(void ); Retourne : Le pid du processus, toujours succ` es. pid t getppid(void ); Retourne : Le pid du p` ere, toujours succ` es.

Luigi Santocanale

Le processus

36

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

IDs utilisateur
#include <unistd.h> uid t getuid(void ); Remarques : propri etaire r eel : utilisateur qui ex ecute le chier ex ecutable. uid t geteuid(void ); Retourne : Le uid, toujours succ` es. Remarques : propri etaire eectif : utilisateur qui poss` ede lex ecutable.

IDs groupe
#include <unistd.h> uid t getgid(void ); uid t getegid(void ); int setgid(uid t uit );

Remarques : Comme pour getuid . . .


int setuid(uid t uit ); Retourne : 0/-1. Remarques : il faut voir permissions de root.
Luigi Santocanale Le processus 37 Luigi Santocanale Le processus 38

Le processus : vue utilisateur Les processus : principes dimpl ementation Appels syst` emes POSIX

Cr eation dun processus : la primitive fork Terminaison dun processus : exit Terminaison et synchronisation : wait Acc` es aux donn ees du bloc de contr ole du processus

R epertoire dun processus, masque de cr eation


#include <unistd.h> int chdir(const char * ref ); Retourne : 0/-1 char const * getcwd(char * buf , size t taille ); buf : un tampon de taille taille. Retourne : buf succ` es, NULL echec mode t umask(mode t masque ); masque : les permission quon aimerait enlever par defaut aux appels de creat, open, mkdir, mkfifo. Retourne : La vielle masque de cr eation
Luigi Santocanale Le processus 39

Vous aimerez peut-être aussi