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 ?
- 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.
- 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.
- 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¶
- 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.
- 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.
- 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 ?
- 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 ?
- Est-il possible dans un processus d’exécuter
int fd1=open("f",O_RDWR);
et juste aprèsint 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 deerrno
?
- 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 ?
- A quoi sert l’appel système sync(2) ?
- 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
quentin
ouvre le fichier/shared_folder/petit_projet.c
en utilisant les drapeauxO_CREAT | O_RDWR | O_TRUNC
, donne les permissions664
, l’associe au groupeboys
et écrit le code de son projet dedans.Quelles sont les permissions que doit avoir
/shared_folder
pour quefrançois
etbrigitte
puissent accéder au fichierpetit_projet.c
?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èmewrite(2)
sur le file descriptor obtenu avec leopen(2)
précédent, et puis le ferme avecclose(2)
. Que se passe-t-il?françois
aimerait aussi rajouter son nom sur le projet et ouvre le fichier avecopen(2)
avec le drapeauO_WRONLY
pour ensuite utiliserwrite(2)
. Que se passe-t-il?Finalement,
quentin
souhaite relire son code et fait appel àopen(2)
avec le drapeauO_RDONLY
, pour ensuite utiliserread(2)
. Que se passe-t-il?
Considérons le fichier
/shared_folder/music.mp3
avec les permissions644
possédé parfrançois
et associé au groupeboys
.- Est-ce que
quentin
peut écouter le morceau? Qu’en est-il pourbrigitte
? Quelles sont les permissions requises pour/shared_folder
afin qu’ils y accèdent? - Supposons maintenant que
quentin
etbrigitte
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 commanderm
.- Que se passe-t-il pour
brigitte
etquentin
? quentin
ferme ensuite le fichier avecclose(2)
. Qui a encore accès au fichier?brigitte
ferme à son tour son file descriptor. Qui a encore accès au fichier?
- Que se passe-t-il pour
- Est-ce que