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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. 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.txt contient ABCDEF. 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);
    `

    • ABxyEF
    • ABxyCDEF
    • xyCDEF
    • ABCDEFxy
    Voir la réponse

    ABxyEF

    lseek 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.