Examen de Systèmes
Licence - Janvier 2000
- Combien d'accès disques sont nécessaires pour accéder à un octet contenu
dans un fichier ?
- À quoi correspondent les droits d'accès du fichier suivant :
- Qui est autorisé à le détruire ?
<321-[19:13]> ls -ail
1388224 -r-xrw---x 1 yunes staff 0 jan 26 18:21 toto
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.
- À quoi une telle commande peut-elle être utile ? Donnez un exemple concret.
- Comment écririez-vous une telle commande en langage C ?
#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);
}
- Que produit le programme précédent ? Et pourquoi ?
- Que se passe-t'il si on change _IOFBF en _IONBF ?
- Quelle est l'influence de TAILLE ?
- Que se passe-t'il si l'on enlève l'appel à lseek() ?
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 :
- la référence d'un répertoire où commencer la recherche.
- une valeur numérique repésentant la profondeur de recherche (-1)
représente l'infini.
- 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 :
- -i <val> permet de sélectionner les
fichiers dont le numéro d'in
ud est égal à val.
- -ppq <val> permet de sélectionner les
fichiers dont la taille est plus petite que val.
- -pgq <val> permet de sélectionner les
fichiers dont la taille est plus grande que val.
- -m <val> permet de sélectionner les fichiers
dont les droits d'accès sont au moins ceux indiqués (ex: r--------
sélectionne tous les fichiers ayant au moins la lecture autorisée pour le
propriétaire).
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.
É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é.
É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".
É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.
Écrire la fonction main de la commande trouve (pensez à tester la
validité des arguments, etc.).
Jean-Baptiste Yunès
2000-02-15