Examen de Systèmes (Licence - Septembre 1999)
- 1.
- Pourquoi un in
ud de type répertoire contient-t'il au moins deux liens ?
- 2.
- Pour un répertoire contenant nf références de fichiers et nr références
de répertoires pouvez-vous dire quel sera le nombre total de liens
apparaissant dans l'in
ud du-dit répertoire ?
Pour un système de fichier à la Unix utilisant la triple indirection
pouvez-vous indiquer combien d'accès disque sont nécessaires pour retrouver un
octet dans un fichier ?
Pourquoi la commande su qui permet de prendre temporairement l'identité
d'un autre utilisateur (à condition de connaître son mot de passe)
nécessite-t'elle l'emploi du bit s (SETUID BIT) ?
369324 -r-sr-xr-x 1 root sys 18360 jan 8 1998 /usr/bin/su
- 1.
- Quel est le contenu du fichier produit par l'exécution du programme
suivant :
mode = O_WRONLY|O_TRUNC|O_CREAT;
f = open("fichier",mode|O_APPEND);
for (i=0; i<100; i++) {
lseek(f,i,SEEK_SET);
write(f,"aaa",3);
}
- 2.
- Même question pour celui-ci :
mode = O_WRONLY|O_TRUNC|O_CREAT;
f = open("fichier",mode);
for (i=0; i<100; i++) {
lseek(f,i,SEEK_SET);
write(f,"aaa",3);
}
- 3.
- Quels seront les résultats produits par les deux programmes précédents si entre
le 50-ième et le 51-iême appel à write() un processus concurrent exécute
l'intégralité (c'est-à-dire sans être interrompu) du code suivant :
mode = O_WRONLY|O_CREAT;
f = open("fichier",mode);
lseek(f,0,SEEK_END);
write(f,"bbbbb",5);
- 1.
- Qu'est-ce qu'un processus zombi ?
- 2.
- Pourquoi toute tentative d'utilisation de la commande kill sur un
processus zombi est-elle vouée à l'échec ?
- 1.
- Pourquoi la capture des signaux n'est-elle pas transmise par héritage lors
d'un appel à exec() ?
- 2.
- Pourquoi est-il utile de pouvoir bloquer temporairement la délivrance de
certains signaux ?
Écrire en langage C le programme d'une commande de nom lance
permettant d'exécuter une commande quelconque avec un environnement
modifié. Ceci permettrait comme dans l'exemple suivant de tester l'effet d'une
variable sur une commande sans modifier l'environnement courant du shell.
L'exemple suivant utilise la modification de la variable d'environnement
LANG permettant de choisir le langage dans lequel seront exprimés les
résultats de la commande date (en pour l'anglais, de pour
l'allemand) :
<verif-71-[11:47]-[septembre]> date
vendredi, 3 septembre 1999, 11:47:32 MET DST
<verif-72-[11:47]-[septembre]> lance LANG en date
Fri Sep 3 11:47:39 MET DST 1999
<verif-73-[11:47]-[septembre]> lance LANG de date
Freitag, 3. September 1999, 11:47:45 Uhr MET DST
Il est rappelé que l'accès à l'environnement est possible en utilisant la
variable externe extern char **environ ou en utilisant le troisième
argument passé à main
main(int argc,char *argv[],char **environ).
La commande lance prendra au moins 3 options : la première sera le nom
de la variable à créer ou modifier, la seconde la valeur de cette variable,
les autres constituant la commande à exécuter.
On se propose d'écrire un petit système transactionnel permettant de réaliser
des opérations sur des comptes bancaires.
Les utilisateurs de ce système sont identifiés par leur uid.
Le solde du compte bancaire d'un utilisateur d'identité i est le
ientier du fichier de nom comptes.
- 1.
- Écrire une commande (ne prenant aucun argument) permettant de consulter le
solde du compte de l'utilisateur. Cette commande sera appelée solde.
- 2.
- Écrire une commande permettant de réaliser une opération de débit ou de crédit
sur le compte de l'utilisateur. Deux options sont possibles : -d pour
effectuer un retrait et -c pour un dépôt. Le prototype de la commande
est le suivant :
operation -d|-c <valeur-numérique-positive>.
- 3.
- Comment empêcher un utilisateur d'écrire un programme permettant de
lire/modifier le solde d'un compte ne lui appartenant pas ?
- 4.
- Que pensez-vous de l'utilisation concurrente de ces commandes ? Comment y
remédier ? Écrire le code permettant de résoudre le(s) problème(s).
Jean-Baptiste Yunes
1999-09-10