Examen de Systèmes I
Licence 2002-2003 Septembre

Exercice

Est-il possible que la taille d'un répertoire soit égale à 0 ? Pourquoi ?

Exercice



umask(S_IWGRP|S_IWOTH);
if (open("toto",O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|
                                       S_IRGRP|S_IWGRP|
                                       S_IROTH|S_IWOTH)<0)
    fprintf(stderr,"Ouverture/Création impossible");


Quel serait le résultat de l'exécution de ce fragment de programme si:
  1. le fichier toto n'existe pas,
  2. le fichier toto existe mais ne vous appartient pas et ses droits d'accès sont r--rw-r-- ?
  3. le fichier toto existe, vous appartient, et ses droits sont r--rw-r-- ?

Exercice

Soit les deux fragments de programmes suivant:


// Programme P1
while ( (n=fread(buf,sizeof(char),taille,s)) > 0 )
  fwrite(buf,sizeof(char),n,d);

// Programme P2
while ( (n=read(s,buf,taille)) > 0 )
  write(d,buf,n);


Des mesures de l'exécution de ces deux portions de code avec des valeurs différentes pour le paramètre taille ont conduit aux résultats suivants:

Temps (P1) Temps (P2)
taille réel util. système réel util. système
16384 0.43 0.07 0.21 0.41 0.00 0.17
8192 0.44 0.02 0.22 0.41 0.00 0.23
4096 0.44 0.03 0.25 0.41 0.02 0.22
2048 0.44 0.02 0.26 0.44 0.04 0.34
1024 0.44 0.01 0.26 0.64 0.02 0.56
512 0.44 0.03 0.26 1.11 0.02 0.99
256 0.41 0.07 0.19 2.03 0.15 1.70
128 0.45 0.09 0.21 3.81 0.15 3.42
64 0.49 0.13 0.22 7.43 0.31 6.60
32 0.47 0.17 0.26 15.42 0.57 13.09
16 0.63 0.34 0.24 33.53 1.06 26.31
8 0.97 0.60 0.31 64.54 2.44 51.74
4 1.59 1.23 0.24 121.32 5.08 104.29
2 2.86 2.42 0.24 235.17 10.14 208.64
1 5.47 4.92 0.26 459.72 19.84 425.96
  1. Expliquez les différences constatées entre les temps d'exécution pour P1 et P2, et en particulier pourquoi l'utilisation sans précautions de la couche POSIX peut se révéler désastreuse ?
  2. À la lecture des résultats sauriez-vous donner l'ordre de grandeur de la taille des caches de la bibliothèque d'E/S du C ? Justifiez.
  3. Si l'on ajoute au programme P1 l'instruction suivante:
    setvbuf(d,NULL,_IONBF,0)
    et ce avant la boucle while, quel serait l'effet de cette modification sur les mesures d'exécution du programme P1 ?

Problème

  1. Écrire une commande poubelle référence ... qui prend au moins une référence de fichier ou répertoire en argument et déplace les objets correspondants dans un répertoire de nom .corbeille (à créer si nécessaire) situé dans le répertoire privé de l'utilisateur.
  2. Écrire une commande vide qui supprime le contenu du répertoire .corbeille (s'il existe) situé dans le répertoire privé de l'utilisateur.
Note: la référence du répertoire privé de l'utilisateur peut être obtenue par un appel à getenv("HOME"); qui renvoit un char *.

Jean-Baptiste Yunès 2003-09-05