Exercices INGINIOUS¶
Les exercices INGINIOUS de cette semaine ont comme objectif de vous familiariser avec la manipulation des fichiers contenant des données binaires.
- 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 ? Voir https://inginious.info.ucl.ac.be/course/LEPL1503/s5_file_exists
- Parfois, il est utile de pouvoir stocker une structure directement dans un fichier. Utilisez mmap(2) pour cela dans l’exercice https://inginious.info.ucl.ac.be/course/LEPL1503/s5_file_save_struct
- 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. Voir https://inginious.info.ucl.ac.be/course/LEPL1503/s5_read_file_array_integer
- 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. Voir https://inginious.info.ucl.ac.be/course/LEPL1503/s5_big_array_get_set
- 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. Voir https://inginious.info.ucl.ac.be/course/LEPL1503/s5_file_copy
Vérifiez 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
./src/writeperf.c
permet de tester les performances des écritures 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
.