Examen de Systèmes
Licence - Janvier 2000

Exercice

  1. Combien d'accès disques sont nécessaires pour accéder à un octet contenu dans un fichier ?

Exercice

  1. À quoi correspondent les droits d'accès du fichier suivant :
  2. Qui est autorisé à le détruire ?
<321-[19:13]> ls -ail
1388224 -r-xrw---x   1 yunes    staff          0 jan  26 18:21 toto

Exercice

NAME
     tee - replicate the standard output

SYNOPSIS
     tee [-ai] [file...]

DESCRIPTION
     The tee utility will copy standard input to standard output,
     making  a  copy  in zero or more files.  tee will not buffer
     its output.  The options determine if  the  specified  files
     are overwritten or appended to.
  1. À quoi une telle commande peut-elle être utile ? Donnez un exemple concret.
  2. Comment écririez-vous une telle commande en langage C ?

Exercice

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

#define TAILLE 10
char buf[TAILLE];

int main() {
        FILE *f;

        f = fopen("f","a+");
        setvbuf(f,buf,_IOFBF,TAILLE);
        fprintf(f,"abcdefghijkl");
        lseek(fileno(f),(off_t)0,SEEK_SET);
        write(fileno(f),"123456",6);
        fclose(f);
}
  1. Que produit le programme précédent ? Et pourquoi ?
  2. Que se passe-t'il si on change _IOFBF en _IONBF ?
  3. Quelle est l'influence de TAILLE ?
  4. Que se passe-t'il si l'on enlève l'appel à lseek() ?

Problème

Il s'agit d'écrire une commande UNIX permettant de retrouver des fichiers répondant à certains critères. Cette commande s'appellera trouve et son source trouve.c, et prendra les paramètres suivants :
  1. la référence d'un répertoire où commencer la recherche.
  2. une valeur numérique repésentant la profondeur de recherche (-1) représente l'infini.
  3. une suite de sélections évaluées par disjonction (et logique). Chaque selection est composée d'un sélecteur et d'une valeur. Les sélecteurs suivants sont possibles :
Cette commande renverra la valeur de retour 0 en cas de succès, et autre chose en cas d'échec. D'autre part des messages d'erreurs devront être envoyés afin d'aider l'utilisateur à comprendre pourquoi la demande a échouée.

Voici un exemple d'utilisation de la commande :

<251-[17:45]> ls -ail
650880 drwxr-xr-x   3 yunes    staff        512 oct  26 16:53 bin/
 51885 -rwx------   5 yunes    staff       1049 jan  24 16:36 code
167040 -r-x------   2 yunes    staff        513 mai  25  1999 cominfo
739200 drwx------   5 yunes    staff        512 mai  19  1999 Desktop/
462720 drwx------   5 yunes    staff       1536 jan  14 15:05 docs/
  3869 -rw-r--r--   2 yunes    staff        128 nov   4 17:41 exclude
268822 drwxr-xr-x   2 yunes    staff        512 juin 29  1999 ftv/
<252-[17:46]> trouve . -ppq 1000 -m -w-------
exclude
<253-[17:46]> trouve . -ppq 1000
exclude
cominfo
<254-[17:46]>
Remarque : Ne vous acharnez pas trop longtemps sur un problème rencontré : vous pouvez toujours supposer avoir résolu ce qui est nécessaire pour avancer.

Première partie

Écrire une fonction dont le prototype sera le suivant :
int verifie(struct stat *buf,ino_t ino,size_t ppq,size_t pgq,mode_t m);
qui renvoie une valeur booléenne (au sens du C) vraie si la structure stat vérifie l'ensemble des critères. Indiquez quelles conventions il est raisonnable d'utiliser pour marquer l'abscence de sélection pour un critère donné.

Deuxième partie

Écrire une fonction de prototype suivant :
char *ajoute(const char *répertoire,const char *nom);
et qui renvoie la référence construite par concaténation du répertoire et du nom.

Exemple : ajoute("truc/bidul","cuicui",) renverra "truc/bidul/cuicui".

Troisième partie

Écrire la fonction :
void trouve(const char *répertoire,int profondeur,ino_t ino,size_t ppq,size_t pgq,mode_t m);
qui réalise la recherche (limitée à la profondeur indiquée) de fichiers vérifiant les critères passés en paramètres.

Quatrième partie

Écrire la fonction main de la commande trouve (pensez à tester la validité des arguments, etc.).

Jean-Baptiste Yunès
2000-02-15