Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
C
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
B
’A
i f n d e f BIBLIO_HDR_H
d e f i n e BIBLIO_HDR_H /* Prevent a c c i d e n t a l mutiple i n c l u s i o n */
i n c l u d e sys / types . h /* Type d e f i n i t i o n s */
i n c l u d e s t d i o . h /* Standard I /O f u n c t i o n s */
i n c l u d e s t d l i b . h /* EXIT_SUCCESS / EXIT_FAILURE constants */
i n c l u d e u n i s t d . h /* Prototypes f o r many system c a l l s */
i n c l u d e errno . h /* D e cl a r e s errno / d e f i n e s e r r o r constant */
i n c l u d e s t r i n g . h /* Commonly used s t r i n g −handling f u n c t . */
endif
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: open()
• Syntaxe:
i n c l u d e sys / s t a t . h
i n c l u d e f c n t l . h
i n t open ( const char * pathname , i n t f l a g s , . . . /* mode_t mode
*/ ) ;
• Retourne le descripteur de chier en cas de succès, ou - sinon
• Diérents modes d’accès:
Mode d’accès Description
O_RDONLY Ouvrir le chier en lecture seule
O_WRONLY Ouvrir le hcier en écriture seule
O_RDWR Ouvrir le chier en lecture et écriture
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: read()
• Syntaxe:
i n c l u d e u n i s t d . h
s s i z e _ t read ( i n t fd , void * b u f f e r , s i z e _ t count ) ;
• Retourne le nombre d’octets lus, au cas où EOF ou - sinon
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: read()
• Syntaxe:
i n c l u d e u n i s t d . h
s s i z e _ t read ( i n t fd , void * b u f f e r , s i z e _ t count ) ;
• Retourne le nombre d’octets lus, au cas où EOF ou - sinon
• Exemple:
// . . .
char b u f f e r [ MAX_READ ] ;
s s i z e _ t numRead ;
numRead read ( STDIN_FILENO , b u f f e r , MAX_READ ) ;
i f ( numRead −)
e r r E x i t ( " read " ) ;
b u f f e r [ numRead ] ’ \ ’ ;
p r i n t f ( " The i n p u t data was : s \n " , b u f f e r ) ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: write()
• Syntaxe:
i n c l u d e u n i s t d . h
s s i z e _ t w r i t e ( i n t fd , void * b u f f e r , s i z e _ t count ) ;
• Retourne le nombre d’octets écrits, ou - en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: write()
• Syntaxe:
i n c l u d e u n i s t d . h
s s i z e _ t w r i t e ( i n t fd , void * b u f f e r , s i z e _ t count ) ;
• Retourne le nombre d’octets écrits, ou - en cas d’erreur
• Exemple:
// . . .
case ’w ’ : /* W r i t e s t r i n g at c u r r e n t o f f s e t */
nWritten w r i t e ( fd , &argv [ ap ] [ ] , s t r l e n (& argv [ ap ] [ ] ) ) ;
i f ( nWritten −)
errE xit ( " write " ) ;
p r i n t f ( "s : wrote l d bytes \n " , argv [ ap ] , ( long ) nWritten ) ;
break ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: close()
• Syntaxe:
i n c l u d e u n i s t d . h
i n t c l o s e ( i n t fd ) ;
• Retourne en cas de succès, ou - en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: close()
• Syntaxe:
i n c l u d e u n i s t d . h
i n t c l o s e ( i n t fd ) ;
• Retourne en cas de succès, ou - en cas d’erreur
• Exemple:
// . . .
i f ( c l o s e ( fd ) −)
e r r E x i t ( " close " ) ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: socket()
• Syntaxe:
i n c l u d e sys / socket . h
i n t socket ( i n t domain , i n t type , i n t p r o t o c o l ) ;
• Retourne le descripteur de chier en cas de succès, ou - en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: socket()
• Syntaxe:
i n c l u d e sys / socket . h
i n t socket ( i n t domain , i n t type , i n t p r o t o c o l ) ;
• Retourne le descripteur de chier en cas de succès, ou - en cas d’erreur
• Exemple:
// . . .
s f d socket ( AF_UNIX , SOCK_STREAM , ) ;
i f ( s f d −)
e r r E x i t ( " socket " ) ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: pipe()
• Syntaxe:
i n c l u d e u n i s t d . h
i n t pipe ( i n t f i l e d e s [ ] ) ;
• Retourne en cas de succès, ou - en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: pipe()
• Syntaxe:
i n c l u d e u n i s t d . h
i n t pipe ( i n t f i l e d e s [ ] ) ;
• Retourne en cas de succès, ou - en cas d’erreur
• Exemple:
// . . .
int filedes [ ] ;
i f ( pipe ( f i l e d e s ) −)
e r r E x i t ( " pipe " ) ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: fork()
• Syntaxe:
i n c l u d e u n i s t d . h
p i d _ t f o r k ( void ) ;
• Retourne process ID du ls en cas de succès, ou - en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: fork()
• Syntaxe:
i n c l u d e u n i s t d . h
p i d _ t f o r k ( void ) ;
• Retourne process ID du ls en cas de succès, ou - en cas d’erreur
• Exemple:
// . . .
pid_t childPid ;
switch ( childPid fork ( ) ) {
case −:
/* Handle e r r o r */
case : /* C h i l d of s u c c e s s f u l f o r k ( ) comes here */
/* Perform a c t i o n s s p e c i f i c to c h i l d */
d e f a u l t : /* Parent comes here a f t e r s u c c e s s f u l f o r k ( ) */
/* Perform a c t i o n s s p e c i f i c to parent */
}
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: pthread_create()
• Syntaxe:
i n c l u d e pthread . h
i n t pthread_create ( pthread_t * thread , const p t h r e a d _ a t t r _ t *
a t t r , void * ( * s t a r t ) ( void * ) , void * arg ) ;
• Retourne en cas de succès, ou n en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: pthread_create()
• Syntaxe:
i n c l u d e pthread . h
i n t pthread_create ( pthread_t * thread , const p t h r e a d _ a t t r _ t *
a t t r , void * ( * s t a r t ) ( void * ) , void * arg ) ;
• Retourne en cas de succès, ou n en cas d’erreur
• Exemple:
// . . .
s pthread_create (& t , NULL , threadFunc , " H e l lo world \n " ) ;
i f ( s ! )
e r r E x i t E N ( s , " pthread_create " ) ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: ioctl()
• Syntaxe:
i n c l u d e sys / i o c t l . h
i n t i o c t l ( i n t fd , i n t request , . . . /* argp */ ) ;
• Retourne une valeur, ou - en cas d’erreur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: ioctl()
• Syntaxe:
i n c l u d e sys / i o c t l . h
i n t i o c t l ( i n t fd , i n t request , . . . /* argp */ ) ;
• Retourne une valeur, ou - en cas d’erreur
• Exemple:
// . . .
int attr ;
i f ( i o c t l ( fd , FS_IOC_GETFLAGS , &a t t r ) −) /* Fetch
c u r r e n t f l a g s */
errExit ( " ioctl " ) ;
a t t r | FS_NOATIME_FL ;
i f ( i o c t l ( fd , FS_IOC_SETFLAGS , &a t t r ) −) /* Update f l a g s
*/
errExit ( " ioctl " ) ;
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
G
Exemples
• Exemple :
// . . .
fd open ( pathname , f l a g s , mode ) ;
i f ( fd −) {
/* Code to handle the e r r o r */
}
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
G
Exemples
• Exemple :
// . . .
fd open ( pathname , f l a g s , mode ) ;
i f ( fd −) {
/* Code to handle the e r r o r */
}
// . . .
• Exemple :
// . . .
i f ( c l o s e ( fd ) −) {
/* Code to handle the e r r o r */
}
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
G
Exemples
• Exemple :
// . . .
cnt read ( fd , buf , numbytes ) ;
i f ( cnt −) {
i f ( errno EINTR )
f p r i n t f ( s t d e r r , " read was i n t e r r u p t e d by a s i g n a l \n " ) ;
else {
/* Some other e r r o r occurred */
}
}
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: perror()
• Syntaxe:
i n c l u d e s t d i o . h
void p e r r o r ( const char *msg ) ;
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
A
D
Appel système: perror()
• Syntaxe:
i n c l u d e s t d i o . h
void p e r r o r ( const char *msg ) ;
• Exemple:
// . . .
fd open ( pathname , f l a g s , mode ) ;
i f ( fd −) {
p e r r o r ( " open " ) ;
e x i t ( EXIT_FAILURE ) ;
}
// . . .
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S •
Dénition
Les signaux sont des interruptions logicielles qui fournissent un
mécanisme de traitement des évenements asynchrones. Ils se
dénissent également comme une notication envoyée à un
processus l’informant qu’un évènement s’est produit.
Appels système
signal() et sigaction() servent, à la réception d’un signal
spécique, à apporter des modications sur des actions
eecuées par un processus.
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
signal()
i n c l u d e s i g n a l . h
typedef void ( * s i g h a n d l e r _ t ) ( i n t ) ;
s i g h a n d l e r _ t s i g n a l ( i n t signum , s i g h a n d l e r _ t handler ) ;
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
signal()
i n c l u d e s i g n a l . h
typedef void ( * s i g h a n d l e r _ t ) ( i n t ) ;
s i g h a n d l e r _ t s i g n a l ( i n t signum , s i g h a n d l e r _ t handler ) ;
Exercice pratique
ps -a
kill SIGSTOP PID
kill SIGCONT PID
kill SIGKILL PID
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • T
Action d’un processus sur réception d’un signal
• Ignorer le signal
• Exécuter une action par défaut (routine de service):
invoquer une routine de traitement fournie par le noyau
• Invoquer une routine spécique dénie par le
programmeur
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • T
Action d’un processus sur réception d’un signal
• Ignorer le signal
• Exécuter une action par défaut (routine de service):
invoquer une routine de traitement fournie par le noyau
• Invoquer une routine spécique dénie par le
programmeur
les actions par défaut se déclinent comme suit:
A: terminer le processus
B: ignorer le processus
C: générer un chier core
D: intérrompre le processus
E: empêcher la modication de routine de service
F: obliger le processus à ne pas ignorer le signal
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • T
Quelques signaux usuels
Signal Num. Action Description
SIGKILL AEF Termine l’exécution du processus
SIGINT D Interrompt le processus (Ctrl-C)
SIGSTOP DEF Suspend le processus (Ctrl-Z)
SIGCONT Poursuite de l’exécution du processus
SIGQUIT DC Interruption forte du processus (Ctrl-\ )
SIGCHLD B Processus ls terminé ou stoppé
SIGUSR A Signal indiquant user-dened cond.
SIGUSR A Signal indiquant user-dened cond.
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
sigaction()
i n c l u d e s i g n a l . h
i n t s i g a c t i o n ( i n t signum , const s t r u c t s i g a c t i o n * newact ,
st ruct sigaction * oldact ) ;
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
sigaction()
i n c l u d e s i g n a l . h
i n t s i g a c t i o n ( i n t signum , const s t r u c t s i g a c t i o n * newact ,
st ruct sigaction * oldact ) ;
struct sigaction
struct sigaction {
void ( * sa_handler ) ( i n t ) ;
sigset_t sa_mask ;
int sa_flags ;
};
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Description de champs
• signum : numéro du signal
• newact:
◦ sa_handler () : SIG_IGN, SIG_DFL et handler()
◦ sa_mask : ensemble de signaux à bloquer lors de l’exécution
de handler()
◦ sa_ags : (optionnel) ex. SA_RESTART redémarre
automatiquement les appels système interrompus.
• oldact: Contient les informations sur l’ancien handler()
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
sa_ags
Flag Signication
SA_NODEFER Rétablir l’action à son comportement par défaut
une fois que le gestionnaire a été appelé
SA_RESTART Redémarrer les appels système interrompus à
l’arrivée du signal
SA_NOCLDSTOP Si signum vaut SIGCHLD, ne pas recevoir les
signaux de notication d’arrêt d’un processus ls
SA_NOCLDWAIT Si signum vaut SIGCHLD, ne pas transformer
les ls en zombies lorqu’ils se terminent
SA_RESETHAND Ne pas empêcher un signal d’être reçu depuis
l’intérieur de son propre gestionnaire
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Ensemble de signaux
sigset_t s est un tableau de booléens représentant un ensemble
de signaux.
• sigaddset(&s, SIGNUM): ajouter le signal spécié par SIGNUM
• sigdelset(&s, SIGNUM): supprimer le signal spécié par SIGNUM
• sigllset(&s, SIGNUM): remplir toutes les cases
• sigismember(&s, SIGNUM): vérier si le signal désigné par SIGNUM est
membre de l’ensemble de signaux s
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Masque de signaux
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S •
Interruption & traitement de signaux
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S •
// . . .
void s i g n a l _ h a n d l e r ( i n t signum )
{
p r i n t f ( " Caught s i g n a l d\n " , signum ) ;
e x i t ( signum ) ;
}
i n t main ( i n t argc , char * argv [ ] )
{
i f ( s i g n a l ( SIGINT , s i g n a l _ h a n d l e r ) SIG_ERR )
f p r i n t f ( s t d e r r , " \ncan ’ t catch SIGINT \n " ) ;
for ( int i ; ; i )
{
p r i n t f ( "d\ t : \ td\n " , i , i ) ;
sleep ( ) ;
}
return ;
}
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Blocage de signaux • sigprocmask()
sigprocmask() permet d’examiner et de changer les signaux
bloqués. L’appel système est utilisé pour changer le masque de
signal, i.e l’ensemble de signaux courants bloqués.
syntaxe
i n c l u d e s i g n a l . h
i n t sigprocmask ( i n t how , const s i g s e t _ t * set , s i g s e t _ t * o l d s e t ) ;
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Valeurs possibles du paramètre de how
Flag Signication
SIG_BLOCK L’ensemble de signaux bloqués est l’union de
l’ensemble courant et de l’argument set
SIG_UNBLOCK Les signaux dans set sont supprimés
de l’ensemble courant de signaux bloqués
SIG_SETMASK L’ensemble de signaux bloqués set est
assigné au masque
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Blocage de signaux: fragment de code
s i g s e t _ t set ;
sigemptyset (& s e t ) ;
s i g a d d s e t (& set , SIGHUP ) ;
sigprocmask ( SIG_BLOCK , &set , NULL ) ;
// c e t t e p a r t i e du code ne peut e t r e interrompue par SIGHUP
sigprocmask ( SIG_UNBLOCK , &set , NULL ) ;
Concepts de base Concepts fondamentaux Gestion de la mémoire Processus / Threads Communication Inter-processus Synchronisation Sécurité système
S • API
Exemple d’utilisation de sigaction
void s i g _ h a n d l e r ( i n t signum ) ...
{ p r i n t f ( " I n s t a l l i n g s i g n a l handler
p r i n t f ( " Received : s i g n a l d\n " , signum f o r s i g n a l d\n " , signum ) ;
);
} r e t v a l s i g a c t i o n ( signum , &action ,
NULL ) ;
i n t main ( i n t argc , char * argv [ ] )
{ i f ( r e t v a l ) {
i f ( argc ! ) { perror ( " sigaction f a i l e d " ) ;
f p r i n t f ( s t d e r r , " usage : s signum\n " abort ( ) ;
, argv [ ] ) ; }
r e t u r n EXIT_FAILURE ;
} while ( ) {
int retval ; p r i n t f ( " [d ] S l e e p i n g . . . \ n " ,
struct sigaction action ; getpid ( ) ) ;
i n t signum a t o i ( argv [ ] ) ; sleep ( ) ;
}
// sigemptyset (& a c t i o n . sa_mask ) ;
a c t i o n . sa_handler s i g _ h a n d l e r ; r e t u r n EXIT_SUCCESS ;
s i g a d d s e t (& a c t i o n . sa_mask , signum ) ; }
a c t i o n . s a _ f l a g s SA_RESTART ;
. . .