Les appels système sur les fichiers
Appel système et fonction de bibliothèque, open et ses drapeaux, read, write, lseek, close, les descripteurs 0, 1 et 2, la valeur de retour, errno et perror.
- 29 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Appel système : de quoi s'agit-il ?
Voir la réponse
Demande d'un programme au noyau pour une opération qu'il n'a pas le droit de faire seul, comme lire un fichier ; le processeur passe du mode utilisateur au mode noyau le temps de la traiter.
Ce passage a un coût, d'où les fonctions de bibliothèque comme fread ou printf qui regroupent les données dans un tampon et n'appellent read ou write qu'à bon escient.
Le fichier
t.txtcontientABCDEF. Que contient-il après ce programme ?
```c
int fd = open("t.txt", O_RDWR);
lseek(fd, 2, SEEK_SET);
write(fd, "xy", 2);
close(fd);`ABxyEFABxyCDEFxyCDEFABCDEFxy
Voir la réponse
ABxyEFlseek place la position à l'octet 2 ; write écrase les deux octets suivants (C et D) sans rien décaler. Le fichier garde sa taille de 6 octets. Écrire à la fin demanderait SEEK_END ou O_APPEND.
Arrivé à la fin du fichier, read rend … ; en cas d'erreur, il rend … et renseigne errno.
Voir la réponse
Arrivé à la fin du fichier, read rend 0 ; en cas d'erreur, il rend -1 et renseigne errno.
Confondre les deux est une faute classique : 0 n'est pas une erreur, c'est le signal d'arrêt normal d'une boucle de lecture.
Descripteur de fichier : de quoi s'agit-il ?
Voir la réponse
Petit entier, propre à chaque processus, qui désigne un fichier ouvert, un tube, une socket ou un terminal pour les appels read, write et close.
C'est l'indice d'une table du processus. Les trois premières entrées sont ouvertes au démarrage : 0 entrée standard, 1 sortie standard, 2 sortie d'erreur.
Un programme ouvre un fichier avec open puis appelle write(fd, "ok", 2) sans tester le retour d'open. Quand le fichier manque, la sortie affiche
write: Bad file descriptor. Quelle est la cause et la correction ?- write n'a pas assez d'octets à écrire : augmenter sa taille
- Le fichier n'est pas fermé : ajouter un close avant le write
- errno a été remis à zéro : le relire avant le write
- open a rendu -1, mauvais descripteur pour write : tester fd == -1 juste après open
Voir la réponse
open a rendu -1, mauvais descripteur pour write : tester fd == -1 juste après open
Le vrai défaut est en amont : open a échoué (« No such file or directory ») et a rendu -1, que le programme a passé à write, qui a protesté. Corriger le write ne ferait que cacher l'erreur ; il faut tester le retour d'open, afficher perror et sortir.