Examen de Systèmes I (Licence - Janvier 2002)

Exercice

Étant donné les références (et droits d'accès associés) suivantes :

drwxr-xr-x   32 root     sys          1024 mai  3  2001 /
drwxr-xr-x    4 root     sys          4096 jan 12 04:05 /users
drwxr-x--x   49 root     sys          4096 jan 12 04:05 /users/home
drwxr-x--x   47 yunes    ens          4096 jan 12 04:05 /users/home/yunes
-rw-r-----    1 yunes    staff         512 mai  3  2001 /users/home/yunes/bidule
drwxrwxr-x    2 root     sys           512 jan 12 04:05 /users/home/yunes/subdir
  1. qui est autorisé à exécuter un ls sur la référence /users/home ?
  2. qui est autorisé à consulter le fichier désigné par la référence /users/home/yunes/bidule ?
  3. qui est autorisé à exécuter un ls sur la référence /users/home/yunes/subdir ?
  4. qui est autorisé à supprimer le répertoire désigné par la référence /users/home/yunes/subdir ?
  5. combien de sous-répertoires le répertoire /users/home/yunes contient-il ?

Exercice

Soit le programme suivant dont l'exécutable correspondant s'appelle truc :

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(char *argv[]) {
  int d; char c;

  d = open("fic",O_RDWR);
  if (d==-1) exit(EXIT_FAILURE);
  while ( 1 )
    switch (read(d,&c,1)) {
    case -1: close(d); exit(EXIT_FAILURE);
    case  0: close(d); exit(EXIT_SUCCESS);
    case  1: if (write(d,&c,1)!=1) { close(d); exit(EXIT_FAILURE); }
             break;
    }
}
  1. on suppose l'existence d'un fichier de nom fic contenant ``toto''. Que contient le fichier fic après l'exécution de la commande truc ?
  2. on suppose l'existence d'un fichier de nom fic contenant ``totot''. Que contient le fichier fic après l'exécution de la commande truc ?
  3. si l'on modifie le programme en remplaçant O_RDWR par O_RDWR|O_APPEND, qu'est ce que cela change pour les questions précédentes ?

Exercice

Soit l'exécutable bidule obtenu après compilation du code source suivant :
int main(char *argv[]) {
  int d1, d2; char c;

  d1 = open("fic",O_RDONLY);
  if (d1==-1) exit(EXIT_FAILURE);
  d2 = open("fic",O_WRONLY);
  if (d2==-1) { close(d1); exit(EXIT_FAILURE); }
  while ( 1 )
    switch (read(d1,&c,1)) {
    case -1: close(d1); close(d2); exit(EXIT_FAILURE);
    case  0: close(d1); close(d2); exit(EXIT_SUCCESS);
    case  1: if (write(d2,&c,1)!=1) { close(d1); close(d2); exit(EXIT_FAILURE); }
             break;
    }
}
  1. on suppose l'existence d'un fichier de nom fic contenant ``toto''. Que contient le fichier fic après l'exécution de la commande bidule ?
  2. si l'on modifie le programme en remplaçant O_WRONLY par O_WRONLY|O_APPEND, quel sera le résultat ?
  3. on suppose maintenant que la référence fic est celle d'un tube nommé.
    1. que se passe-t'il avec le programme précédent ?
    2. après avoir lancé bidule, on exécute par ailleurs la commande true >> fic. Que se passe-t'il ? (la commande Unix true ne génère aucune sortie).
    3. on exécute alors la commande echo >> fic. Que se passe-t'il ?

Exercice

  1. Écrire une fonction int concat(int s1,int s2,int d) permettant de concaténer le contenu des fichiers désignés par les descripteurs s1 et s2 dans le fichier désigné par le descripteur d.
  2. Sous quelles conditions une telle fonction réalise-t'elle la spécification (il faut étudier des scénarios possibles d'utilisation) ?

Problème

Écrire une commande range <dir> <critere> <destination> qui pour chaque référence de fichier situé sous le répertoire <dir> et vérifiant le <critere>, la déplace dans la <destination> en préservant l'arborescence.

Autrement dit, il s'agit de déplacer une sous-partie de l'arbre <dir> vers la <destination>. La sous-partie étant définie par le critère que doivent vérifier les références de fichier de l'arbre.

Par exemple : la commande range /ens/yunes -s .c /ens/yunes/sources déplacera les fichiers
/ens/yunes/truc.c et /ens/yunes/projet/systeme/main.c vers /ens/yunes/sources/truc.c et
/ens/yunes/sources/projet/systeme/main.c

Les critères possibles sont -p <préfixe> ou -s <suffixe>. Donc permettent de contrôler si une référence de fichier commence ou termine par une chaîne de caractères donnée.

Pour cela, on pourra utiliser la fonction char *strstr(char *s1,char *s2) qui renvoie le pointeur dans s1 qui correspond à la localisation de s2 (et NULL sinon) :

char *s1 = "tout va bien";
strstr(s1,"va")==s1+5
strstr(s1,"alors c'est ou ?")==NULL


Jean-Baptiste Yunes 2002-01-31