Examen de Systèmes (Licence - Septembre 1999)

Exercice

1.
Pourquoi un in\oeud 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\oeud du-dit répertoire ?

Exercice

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 ?

Exercice

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

Exercice

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);

Exercice

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 ?

Exercice

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 ?

Problème

É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.

Problème

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