Articles récents
Linux/Unix : Les entrées / sorties
Dans le monde Unix, les entrées/sorties sont traitées sous forme de fichiers, on dit que tout est fichiers sous Unix.
La gestion des fichiers distingue les primitives (sorte de fonctions de bas niveau, comparable à des appels système) qui traitent des descripteurs et des fonctions de plus haut-niveau qui manipulent des flux.
1) Les flux standards
Chaque processus dispose d'une table de descripteur qui correspond aux fichiers qu'il utilise.Par défaut:
En C, on distingue deux grands types de commandes:
2) Les opérations de base (primitives)
2.1) Ouverture/fermeture d'un fichier
Pour ouvrir un fichier, on dispose de la fonction open.La fonction retourne le descripteur de fichier avec pour référence le pointeur chemin, si erreur la fonction retourne -1 et errno. Le paramètre type Open définit le type d'ouverture désiré :
Par exemple: open("/tmp/myfic",O_WRONLY|O_CREAT|O_TRUNC,0777);
Pour fermer un fichier on utilise, la fonction close :
A noter que l'appel système exit() clôture tous les fichiers ouvert par le processus.
2.2) Lecture/Ecriture dans un fichier
Les fonctions read() et write() sont utilisées pour lire ou écrire dans un fichier.2.2) Déplacement dans un fichier
Le fichier unistd.h contient trois constantes macro-définies qui sont les seules valeurs :
La primitive retournera la position courante ou -1 en cas d'erreur.
3) les entrées/sorties standards
La bibliothèque stdio.h définie les entrées/sorties standard, c'est une couche au dessus des primitives POSIX précédentes.3.1)ouverture/fermeture d'un fichier
fopen provoque l'ouverture du fichier pointé par ref et renvoie un pointeur sur l'objet FILE associé au fichier. En cas, d'échec la fonction renvoie NULL.
Le paramètre mode précise le mode d'ouverture du fichier. Les options principales sont:
3.2)Lecture dans un fichier
3.3)Ecriture dans un fichier
Il existe d'autres fonctions comme fseek() pour se déplacer dans le fichier et feof() pour tester la fin du fichier.
4)Les verrous
4.1)Les verrous externes
Il s'agit d'un fichier dont la présence provoque le verrouillage de la ressource à protéger. Pour le créer,on utilise la primitive open avec O_CREAT pour la création de fichiers et O_EXCL pour activer le mode exclusif.Si le fichier verrou n'existe pas, la primitive créera le fichier retournera son descripteur, et si le fichier existe la primitive retourne -1 avec errno=EEXIST.
Pour retirer l'exclusion, on retire le fichier verrou par la primitive unlink().
Second cas d'utilisation: Par le mécanisme du verrou, il est possible de limiter une commande à une seule exécution. Voici un exemple de code:
Seconde cas d'utilisation: Par le mécanisme du verrou, il est aussi possible de limiter l'accès d'un fichier à une seule instance. Voici un exemple de code:
Ce mécanisme est fort utile, mais attention, il est coûteux en accès disque et CPU. En outre, il y a une possibilité d'interbloquage (deadlock).
4.2)Les verrous externes
Il s'agit d'un mécanisme de la norme POSIX. Le système gère une table des verrous dont chaque itération est au format de la structure flock, qui peut être consultée ou modifiée avec la primitive fcntl().La structure flock:
Attention, par défaut les verrous internes sont justes consultatifs, ils n’empêchent pas réllement les accès! Certaines implémentations autorisent le verrouillage exclusif à l'aide du set-gid bit en complément du verrouillage du verrouillage interne.
Voici un exemple de code:
Conclusion
Nous avons vu les quelques fonctions d'entrées/sorties dédiées au C Système Unix/Linux. Mais aussi la notion de verrou qui sera complété dans le monde des threads par d'autres mécanismes plus performants.
© 2024 www.doritique.fr par Robert DORIGNY