Examen de Systèmes I
Licence - Septembre 2001
Un utilisateur désire partager un ensemble de fichiers et répertoires avec un
autre utilisateur en particulier (et lui seul). Quelles sont les possibilités
offertes par un système de fichiers Unix ? Critiquez la ou les solutions
trouvées...
Que recouvre le terme de fragmentation pour un système de fichiers ?
On dispose dans une bibliothèque de la fonction cat() dont le code
est le suivant :
#define TAILLE 512
void cat() {
int l; char buf[TAILLE];
while((l=read(STDIN_FILENO,buf,TAILLE))>0) {
if (write(STDOUT_FILENO,buf,l)!=l) {
write(STDERR_FILENO,"erreur\n",7);
break;
}
}
}
Il vous est demandé d'utiliser la fonction cat() pour simuler par
programme l'effet de la ligne de commande shell suivante :
shell> cat < toto > titi 2>&1
- quels fragments de code devez-vous écrire avant d'appeler la
fonction ?
- quels fragments de code devez-vous écrire après l'appel afin de
restaurer l'état des fichiers ouverts ?
- quelle est l'influence de la contante TAILLE ?
Pour les deux premières questions indiquez aussi l'état des différentes
tables.
Voici le code de la commande zarbi :
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#define ROT13(x) (isalpha(x)?((x)>'m'?(x)-13:(x)+13):(x))
int main(int argc,char *argv[]) {
int f1, f2;
char c;
f1 = open("f1",O_RDONLY);
if (f1==-1) exit(EXIT_FAILURE);
unlink("f1");
f2 = open("f2",O_WRONLY|O_TRUNC);
if (f2==-1) { close(f1); exit(EXIT_FAILURE); }
link("f2","f1");
while (read(f1,&c,1)>0) {
c = ROT13(c);
if (write(f2,&c,1)!=1) { close(f1); close(f2); exit(EXIT_FAILURE); }
}
close(f2);
unlink("f2");
close(f1);
exit(EXIT_SUCCESS);
}
On suppose que le fichier f1 existe, qu'il est lisible et qu'il
contient bonjour :
- le fichier f2 n'existant pas, indiquez ce qui se passe
après l'exécution de la commande zarbi et quels sont les
résultats ?
- on recréé le fichier f1 (avec le même contenu) puis un fichier
f2 avec un contenu quelconque. Indiquez ce qui se passe après
l'exécution de la commande et quels sont les résultats ?
- même questions si l'on remplace f2 = open(...) par f2 =
dup(f1);
- si l'on remplace les appels à open, read,
write et close par des appels à fopen,
fread, fwrite et fclose, quelles sont les
différences induites sur les résultats, le système, l'efficacité,
etc ?
Écrire une commande somme [ <rép> ] permettant de calculer la
taille (en octets) cumulée de tous les fichiers réguliers accessibles depuis
le répertoire indiqué (ou le répertoire courant sinon), puis répondre à la
question suivante :
- la taille calculée est-elle la taille occupée par les données sur le
disque ?
Jean-Baptiste Yunès 2001-10-02