Exercices INGINIOUS

Les exercices INGINIOUS de cette semaine ont comme objectif de vous familiariser avec les appels systèmes open(2), close(2), read(2), write(2) et stat(2) qui permettent de manipuler les fichiers contenant des données binaires.

1. Le premier exercice est une mise en jambe. En utilisant open(2) (et close(2)), pouvez-vous vérifier si un fichier dont le nom est passé en argument existe ?

  1. L’avantage des fichiers binaires est qu’il est possible de sauvegarder directement un tableau stocké en mémoire dans le fichier en utilisant write(2) pour écrire chaque élément du tableau dans un fichier. En lisant les pages de manuel de write(2), vous verrez même qu’un seul appel à write(2) peut suffire à sauver tout un tableau dans un fichier. Ecrivez cette fonction save.
  2. Un fichier binaire peut être utilisé pour stocker tous les éléments d’un tableau d’entiers. Ecrivez la fonction sum_file qui prend comme argument un nom de fichier contenant un tel tableau et calcule la somme de tous les entiers stockés dans le fichier. Pensez aux cas d’erreurs possibles si le fichier n’a pas la bonne taille.

4. Vous continuez à explorer les fichiers binaires qui permettent de stocker tous les éléments d’un tableau d’entiers. Cette fois-ci vous devez écrire une première fonction pour récupérer la valeur d’un élément du tableau stocké dans le fichier et une seconde fonction pour modifier la valeur d’un élément de ce tableau.

  1. En ligne de commande, cp(1) vous permet de copier complètement un fichier quel que soit son contenu. Pouvez-vous implémenter l’équivalent de cette commande dans la fonction copy que vous allez écrire en C.

Verifiez vos réponses

Exercices

  1. Consultez la page de manuel de chmod(1) ou d’autres sources pour déterminer la signification des bits de permissions lorsqu’ils sont associés à un répertoire. Expliquez notamment à quoi sert le bit d’exécution sur un répertoire.
  1. Quelles sont les permissions associées à votre répertoire de login ? Ces permissions permettent-elles à d’autres étudiants d’accéder à vos fichiers ? Si oui, utilisez chmod(1) pour supprimer cette autorisation de lecture par défaut dans votre répertoire.
  2. Comment feriez-vous en utilisant chmod(1) pour créer un répertoire dans lequel vous pouvez lire et écrire, tout étudiant peut lire mais aucun membre du staff (à part l’administrateur système bien entendu) ne peut lire ?
  1. Le répertoire /tmp est particulier car il est destiné à pouvoir contenir des fichiers de n’importe quel utilisateur. Pouvez-vous expliquer les permissions utilisées pour ce répertoire ?
  1. Est-il possible dans un processus d’exécuter int fd1=open("f",O_RDWR); et juste après int fd2=open("f",O_RDONLY); ? Si oui, quelles seront les valeurs des descripteurs de fichiers retournés lors des appels système. Si non, quelles seront les valeurs de errno?
  1. Comment se comporte l’appel système write(2) lorsque le disque sur lequel on souhaite écrire des données est plein ? Peut-on distinguer cette erreur d’un problème d’écriture sur le disque ?
  1. A quoi sert l’appel système sync(2) ?
  1. Le programme /Programmes/src/writeperf.c permet de tester les performances des écritures dans write sur un système de fichiers. Compilez-le et exécutez le avec différents tailles de buffers passés à write(2). Mesurez le temps d’exécution avec la commande time(1posix) et comparez le temps qu’il faut pour écrire 100MB en blocs de 1 MB ou en blocs de 1 KB. Faites de même en activant la synchronisation avec le paramètre -s.

Questions de bilan final

Un système informatique est utilisé par 3 utilisateurs: quentin, brigitte and françois. Ils appartiennent à des groupes différents comme décrit ci-dessous.

$ groups quentin
quentin : quentin boys

$ groups brigitte
brigitte: brigitte girls sudo wheel

$ groups françois
françois: françois boys
  1. quentin ouvre le fichier /shared_folder/petit_projet.c en utilisant les drapeaux O_CREAT | O_RDWR | O_TRUNC, donne les permissions 664, l’associe au groupe boys et écrit le code de son projet dedans.

    1. Quelles sont les permissions que doit avoir /shared_folder pour que françois et brigitte puissent accéder au fichier petit_projet.c?

    2. brigitte, de son côté, lance ensuite les commandes suivantes.

      $ sudo chown brigitte:girls /shared_folder/petit_projet.c
      $ chmod 660 /shared_folder/petit_projet.c
      

      quentin veut maintenant sauvegarder son travail avec l’appel système write(2) sur le file descriptor obtenu avec le open(2) précédent, et puis le ferme avec close(2). Que se passe-t-il?

    3. françois aimerait aussi rajouter son nom sur le projet et ouvre le fichier avec open(2) avec le drapeau O_WRONLY pour ensuite utiliser write(2). Que se passe-t-il?

    4. Finalement, quentin souhaite relire son code et fait appel à open(2) avec le drapeau O_RDONLY, pour ensuite utiliser read(2). Que se passe-t-il?

  2. Considérons le fichier /shared_folder/music.mp3 avec les permissions 644 possédé par françois et associé au groupe boys.

    1. Est-ce que quentin peut écouter le morceau? Qu’en est-il pour brigitte? Quelles sont les permissions requises pour /shared_folder afin qu’ils y accèdent?
    2. Supposons maintenant que quentin et brigitte sont en train d’écouter le morceau MP3. Observant qu’il ne lui reste que peu d’espace disque disponible, françois supprime le fichier /shared_folder/music.mp3 avec la commande rm.
      1. Que se passe-t-il pour brigitte et quentin?
      2. quentin ferme ensuite le fichier avec close(2). Qui a encore accès au fichier?
      3. brigitte ferme à son tour son file descriptor. Qui a encore accès au fichier?