Professional Documents
Culture Documents
Entrees Sorties FR
Entrees Sorties FR
Yann Catanese
ISEN
XX Octobre 2023
Unix/Linux Programmation Système C
Sommaire
1 Entrées sorties
Acces aux chiers
Fichiers normaux
Les répertoires, les liens et les inodes
3 Programmation
Gérer les erreurs
Portabilité
Unix/Linux Programmation Système C
Entrées sorties
Acces aux chiers
Fichiers normaux
Les chiers sont référencés par des inodes dans le système de chiers
Structure de données de gestion de chier
Répéré par un entier unique dans le système de chiers
Système de chiers = espace d'adressage
On retrouve les mêmes appels système pour tous les types de chiers, y compris
les périphériques.
include
#include <sys / types . h>
#include <sys / stat . h>
#include <unistd . h>
#include <f c n t l . h>
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
Exemple d'entrées-sorties sur un chier
Descriptif creat
Include
sys/types.h
sys/stat.h
But : Création d'un chier. Si la création réussit, le chier est
fcntl.h
disponible via son le descritor pour des actions de
lecture/écriture suivant les options de ag. ATTENTION
Si le chier
existe, il sera
écrasé
Signature :
int creat(const char *pathname, int ags);
Paramètres :
const char *pathname : Chemin de création du chier
int ags : Type d'acces au chier
O_RDONLY,O_WRONLY,O_RDWR etc.
Valeur de retour int : Retourne le plus petit descripteur de chier (3 au
début) , ou -1 en cas d'erreur
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Exemple creat
Code Creat.c
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s t a t . h>
#i n c l u d e < f c n t l . h>
i n t main ( i n t a r g c , c h a r ** a r g v , c h a r ** envp )
{
int iFileDescripteur ;
i F i l e D e s c r i p t e u r=c r e a t ( " . / New . t x t " ,O_RDONLY) ;
i f ( i F i l e D e s c r i p t e u r == =1 ) {
p e r r o r ( " I m p o s s i b l e de c r e e r l e f i c h i e r " ) ;
exit (1);
}
p r i n t f ( " F i c h i e r c r e e r o u v e r t , l e f i l e d e s c r i p t o r e s t %d \n" , i F i l e D e s c r i p t e u r ) ;
exit (0);
// REMARQUE : l e s y s t e m e c l o s automatiquement l e s
// f i l e d e s c r i p t o r o u v e r t s s u r f i n de p r o c e s s u s
}
Execution Creat
$ >./ C r e a t
F i c h i e r c r e e r ouvert , l e f i l e d e s c r i p t o r est 3
$>l s = l New . t x t
=rwx ====== 1 c a t a n e s e c a t a n e s e 0 j u i l . 12 1 5 : 2 2 New . t x t
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Descriptif open
Signatures :
int open(const char *pathname, int ags);
int open(const char *pathname, int ags, mode_t mode);
Paramètres :
const char *pathname : Chemin d'accès au chier
int ags : Type d'acces au chier
O_RDONLY,O_WRONLY,O_RDWR etc.
mode_t mode : Droits attribué à un nouveau chier
S_IRWXU,S_IRUSR etc.
Exemple open
Code Open.c
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s t a t . h>
#i n c l u d e < f c n t l . h>
i n t main ( i n t a r g c , c h a r ** a r g v , c h a r ** envp )
{
int iFileDescripteur ;
i F i l e D e s c r i p t e u r=open ( " . / Open . t x t " ,O_RDONLY) ;
i f ( i F i l e D e s c r i p t e u r == =1 ) {
perror (" Impossible d ' ouvrir le f i c h i e r " );
exit (1);
}
p r i n t f ( " F i c h i e r o u v e r t , l e f i l e d e s c r i p t o r a p o u r v a l e u r %d \n" , i F i l e D e s c r i p t e u r ) ;
exit (0);
// REMARQUE : l e s y s t e m e c l o s automatiquement l e s f i l e d e s c r i p t o r o u v e r t s s u r f i n de p r
}
Execution Open
$ >./Open
I m p o s s i b l e d ' o u v r i r l e f i c h i e r : No s u c h f i l e o r d i r e c t o r y
$>echo " t o t o " > Open . t x t
$ >./Open
F i c h i e r ouvert , l e f i l e d e s c r i p t o r a pour v a l e u r 3
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Execution OpenNew
$ >./OpenNew
I m p o s s i b l e de c r e e r l e f i c h i e r : P e r m i s s i o n d e n i e d
F i c h i e r cree , l e f i l e d e s c r i p t o r a pour v a l e u r 3
$>l s = l New . t x t
=rwx ====== 1 c a t a n e s e c a t a n e s e 0 j u i l . 12 1 1 : 3 9 New . t x t
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Descriptif close
Exemple close
Code Close.c
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s t a t . h>
#i n c l u d e < f c n t l . h>
#i n c l u d e <u n i s t d . h>
i n t main ( i n t a r g c , c h a r ** a r g v , c h a r ** envp )
{
i n t i F i l e D e s c r i p t e u r , iRetourSystem ;
i F i l e D e s c r i p t e u r=open ( " . / Open . t x t " ,O_RDONLY) ;
i f ( i F i l e D e s c r i p t e u r == =1 ) {
perror (" Impossible d ' ouvrir le f i c h i e r " );
exit (1);
}
p r i n t f ( " F i c h i e r o u v e r t , l e f i l e d e s c r i p t o r a p o u r v a l e u r %d \n" , i F i l e D e s c r i p t e u r ) ;
i R e t o u r S y s t e m=c l o s e ( i F i l e D e s c r i p t e u r ) ;
i f ( i R e t o u r S y s t e m == =1) {
perror (" Impossible d ' ouvrir le f i c h i e r " );
exit (1);
}
p r i n t f ( " F i c h i e r ferme , l e f i l e d e s c r i p t o r a i v a i t p o u r v a l e u r %d \n" , i F i l e D e s c r i p t e u r ) ;
exit (0);
}
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Exemple close
Execution Close
$ >./ C l o s e
F i c h i e r ouvert , l e f i l e d e s c r i p t o r a pour v a l e u r 3
F i c h i e r ferme , l e f i l e d e s c r i p t o r a i v a i t p o u r v a l e u r 3
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Descriptif read
Signature :
size_t read(int fd, void *buf, size_t count);
Paramètres :
int fd : Le le descriptor du chier obtenu après open our creat
void *buf : La chaine de caractères que l'on souhaite "remplir" des
caractères lus, passée par référence
size_t count : Le nombre d'octets que l'on souhaite lire
Valeur de retour int : Retourne le nombre d'octets eectivement lus, 0
en cas de n de chier, ou -1 en cas d'erreur
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Exemple read
Code Read.c
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s t a t . h>
#i n c l u d e < f c n t l . h>
#i n c l u d e <u n i s t d . h>
#d e f i n e TAILLE_CHAINE 14
i n t main ( i n t a r g c , c h a r ** a r g v , c h a r ** envp )
{
int iFileDescripteur ;
s i z e _ t iNbLus ;
c h a r c p L i g n e [ TAILLE_CHAINE ] ;
i F i l e D e s c r i p t e u r=open ( " . / ReadSource . t x t " ,O_RDONLY) ;
i f ( i F i l e D e s c r i p t e u r == =1 ) {
perror (" Impossible d ' ouvrir le f i c h i e r " );
exit (1);
}
p r i n t f ( " F i c h i e r o u v e r t , l e f i l e d e s c r i p t o r a p o u r v a l e u r %d \n" , i F i l e D e s c r i p t e u r ) ;
iNbLus = r e a d ( i F i l e D e s c r i p t e u r , cpLigne , s i z e o f ( c p L i g n e ) ) ;
w h i l e ( iNbLus > 0){
p r i n t f ( " L i g n e l u e : %s de %d c a r a c t e r e s \n" , cpLigne , ( i n t ) iNbLus ) ;
iNbLus = r e a d ( i F i l e D e s c r i p t e u r , cpLigne , s i z e o f ( c p L i g n e ) ) ;
}
close ( iFileDescripteur );
exit (0);
}
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Exemple read
Execution ReadNew
$ >./ Read
F i c h i e r ouvert , l e f i l e d e s c r i p t o r a pour v a l e u r 3
L i g n e l u e : L i g n e un !
de 14 c a r a c t e r e s
L i g n e l u e : L i g n e deux !
de 14 c a r a c t e r e s
Ligne lue : Ligne t r o i s !
de 14 c a r a c t e r e s
Ligne lue : Ligne quatre !
de 14 c a r a c t e r e s
Ligne lue : Ligne cinq !
de 14 c a r a c t e r e s
Ligne lue : Ligne s i x !
de 14 c a r a c t e r e s
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Descriptif write
Signature :
size_t write(int fd, void *buf, size_t count);
Paramètres :
int fd : Le le descriptor du chier obtenu après open our creat
void *buf : adresse d'une zone mémoire contenant les données à
écrire
size_t count : Le nombre d'octets que l'on souhaite écrire
Valeur de retour int : Retourne le nombre d'octets eectivement écrits,
ou -1 en cas d'erreur
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Exemple write
Code Write.c
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / s t a t . h>
#i n c l u d e < f c n t l . h>
#i n c l u d e <u n i s t d . h>
#i n c l u d e < s t r i n g . h>
#d e f i n e TAILLE_CHAINE 20
i n t main ( i n t a r g c , c h a r ** a r g v , c h a r ** envp ) {
int iFileDescripteur ;
size_t iNbEcrits ;
c h a r c p L i g n e [ TAILLE_CHAINE ] , cpNumero [ 3 ] ;
i F i l e D e s c r i p t e u r=open ( " . / W r i t e D e s t i n a t i o n . t x t " ,O_CREAT|O_WRONLY,S_IRWXU ) ;
i f ( i F i l e D e s c r i p t e u r == =1 ) {
perror (" Impossible d ' ouvrir le f i c h i e r " ); exit (1);
}
p r i n t f ( " F i c h i e r o u v e r t , l e f i l e d e s c r i p t o r a p o u r v a l e u r %d \n" , i F i l e D e s c r i p t e u r ) ;
f o r ( i n t i =1; i <11; i ++) {
b z e r o ( cpLigne , s i z e o f ( c p L i g n e ) ) ; // on met l e b u f f e r a z e r o
s t r c p y ( cpLigne , " C h a i n e " ) ;
s p r i n t f ( cpNumero , "%d" , i ) ;
s t r c a t ( cpLigne , cpNumero ) ;
s t r c a t ( cpLigne , "\n" ) ;
i N b E c r i t s = w r i t e ( i F i l e D e s c r i p t e u r , cpLigne , s t r l e n ( c p L i g n e ) ) ;
p r i n t f ( " L i g n e e c r i t e : %s de %d c a r a c t e r e s \n" , cpLigne , ( i n t ) i N b E c r i t s ) ;
}
close ( iFileDescripteur );
exit (0);
Unix/Linux Programmation Système C
Les appels systèmes sur les chiers
creat(), open(), read(), write(), close()
Exemple write
Execution WriteNew
$ >./ W ri te
F i c h i e r ouvert , l e f i l e d e s c r i p t o r a pour v a l e u r 3
Ligne e c r i t e : Chaine 1
de 9 c a r a c t e r e s
Ligne e c r i t e : Chaine 2
de 9 c a r a c t e r e s
Ligne e c r i t e : Chaine 3 $>c a t W r i t e D e s t i n a t i o n . t x t
de 9 c a r a c t e r e s Chaine 1
Ligne e c r i t e : Chaine 4 Chaine 2
de 9 c a r a c t e r e s Chaine 3
Ligne e c r i t e : Chaine 5 Chaine 4
de 9 c a r a c t e r e s Chaine 5
Ligne e c r i t e : Chaine 6 Chaine 6
de 9 c a r a c t e r e s Chaine 7
Ligne e c r i t e : Chaine 7 Chaine 8
de 9 c a r a c t e r e s Chaine 9
Ligne e c r i t e : Chaine 8 C h a i n e 10
de 9 c a r a c t e r e s C h a i n e 11
Ligne e c r i t e : Chaine 9
de 9 c a r a c t e r e s
L i g n e e c r i t e : C h a i n e 10
de 10 c a r a c t e r e s
L i g n e e c r i t e : C h a i n e 11
de 10 c a r a c t e r e s
Unix/Linux Programmation Système C
Programmation
Gérer les erreurs
Attention
Comment programmer
Programmation C classique
Programmation modulaire
Indentation / Commentaires / norme de nommage /etc.
Utilisation de gcc avec le options usuelles :
Règles d'or
Indentation
Norme de nommage
Commentaires
GDB VS printf
Makele
Gestion version
Unix/Linux Programmation Système C
Programmation
Gérer les erreurs
Fichiers d'inclusion
Standards et normes