Examen de Systèmes I
Licence - Septembre 2001

Exercice

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...

Exercice

Que recouvre le terme de fragmentation pour un système de fichiers ?

Exercice

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
  1. quels fragments de code devez-vous écrire avant d'appeler la fonction ?
  2. quels fragments de code devez-vous écrire après l'appel afin de restaurer l'état des fichiers ouverts ?
  3. quelle est l'influence de la contante TAILLE ?
Pour les deux premières questions indiquez aussi l'état des différentes tables.

Exercice

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 :
  1. 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 ?
  2. 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 ?
  3. même questions si l'on remplace f2 = open(...) par f2 = dup(f1);
  4. 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 ?

Exercice

É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 :
  1. la taille calculée est-elle la taille occupée par les données sur le disque ?


Jean-Baptiste Yunès 2001-10-02