TD/TP8
Transcription
TD/TP8
Université Paris Diderot L3 Informatique Année 2008-2009 TD/TP de Système no 8 : Création d’arborescences Exercice 1 : mkdir récursif On souhaite écrire une commande recmkdir qui se comporte comme mkdir -p, c’est-àdire créant les répertoires dont les noms sont passés en argument sans occasionner d’erreur s’ils existent déjà et en créant éventuellement les ancêtres nécessaires. 1. Écrire une fonction char *next_slash(char *ref) qui remplace le premier caractère / de la chaîne ref (s’il existe) par un caractère de fin de chaîne, puis retourne un pointeur sur ce caractère ; la fonction retournera NULL si aucun / n’est présent dans ref. 2. Écrire une fonction int recmkdir(char *ref, mode_t mode) se comportant comme mkdir, à la nuance près que les répertoires ancêtres de ref sont créés s’ils n’existent pas. En particulier, cette fonction retournera 0 si le répertoire a été créé, et -1 sinon (et errno sera alors positionnée de manière appropriée). 3. Écrire la fonction main de la commande. Exercice 2 : sauvegarde d’une arborescence par ln récursif On souhaite écrire une commande sauv qui crée une copie d’une arborescence (repérée par sa racine) dans une autre, en créant les sous-répertoires nécessaires et en dupliquant les liens vers les i-nœuds des autres fichiers qu’elle contient. Le comportement attendu varie légèrement selon que le répertoire destination existe déjà ou non, comme illustré par l’exemple de la page suivante. Pour créer créer le fichier newname comme un lien vers l’i-nœud de oldname, on utilisera l’appel système int link(const char *oldname, const char *newname). On pourra décomposer le programme en : 1. une fonction récursive void sauv_rec(char *src, char *dest) effectuant la sauvegarde du répertoire src sous le nom dest ; cette fonction créera si nécessaire le répertoire dest avant de parcourir src pour lancer récursivement des sauvegardes des sous-répertoires et créer des liens physiques vers les autres fichiers ; 2. une fonction void sauvegarde(char *src, char *dest) qui vérifie que la référence src est celle d’un répertoire, puis teste si dest existe ou non, avant de lancer sauv_rec avec les arguments adaptés. Julien Cristau, Anne Micheli, Samuel Mimram Université Paris Diderot L3 Informatique lucien:~$ ls -iR * Tata: Titi: 2336864 fifi 2336866 loulou 2336865 riri 2336862 Toto Titi/Toto: 2336863 Turlu 2336867 Tutu Titi/Toto/Turlu: 2336868 chapeau Titi/Toto/Tutu: 2336869 pointu lucien:~$ lucien:~$ sauv Titi Tata lucien:~$ ls -iR Tata Tata: 2336874 Titi Tata/Titi: 2336864 fifi 2336866 loulou 2336865 riri 2336875 Toto Tata/Titi/Toto: 2336876 Turlu 2336877 Tutu Tata/Titi/Toto/Turlu: 2336868 chapeau Tata/Titi/Toto/Tutu: 2336869 pointu lucien:~$ lucien:~$ sauv Titi Grosminet lucien:~$ ls -iR Grosminet Grosminet: 2336864 fifi 2336866 loulou 2336865 riri 2336879 Toto Grosminet/Toto: 417354 Turlu 417355 Tutu Grosminet/Toto/Turlu: 2336868 chapeau Grosminet/Toto/Tutu: 2336869 pointu 2 Année 2008-2009