Vous êtes sur la page 1sur 5

Université Mohammed V — Rabat 2016—2017

Faculté des Sciences Rabat Systèmes d'Exploitation 1


Département d'informatique SMI — S3

Evaluation de fin de semestre : Systèmes d'Exploitation 1


Corrigé
Exercice 1 (7.5 points)
Supposons que le masque courant est 022. Écrire les commandes permettant les actions suivantes sans changer de
répertoire :
1. Créer un répertoire perms et se déplacer dans ce répertoire ;
Réponse (0.5 points) :
 
$ mkdir perms
$ cd perms
 

2. Afficher le masque courant ;


Réponse (0.25 points) :
 
$ umask
 

3. Changer umask à 0 ;
Réponse (0.25 points) :
 
$ umask 0

é 
ig
4. Créer un nouveau fichier nommé empty. Quels sont ses droits d’accès ?
Réponse (0.5 points) :
 
$ touch empty
rr
ses droit d'accès sont 777 − 000 = 777 puis enlever le droit d'exécutions ==> 666
 

5. Créer un nouveau répertoire newdir. Quels sont ses droits d’accès ?


Co

Réponse (0.5 points) :


 
$ mkdir newdir
Droits d'accès 777 − 000 = 777.
 
Evaluation de fin de semestre : Systèmes d'Exploitation I (5 Janvier 2017)

6. Créer un fichier file1 dans perms et lui donner les droits d’accès 664 ;
Réponse (0.5 points) :
 
$ touch file1
$ chmod 664 file1
 

7. Créer un deuxième fichier file2 dans perms et lui donner les droits d’accès 604 ;
Réponse (0.5 points) :
 
$ touch file2
$ chmod 604 file2
 

8. Changer umask à 077 ;


Réponse (0.25 points) :
 
$ umask 077
 

9. Copier file1 vers file1new. Quels sont les droits d’accès du fichier file1new ?
Réponse (0.5 points) :

1
 
$ cp file1 file1new
file1new est nouvellement crée, ses droit d'accès sont 777 − 077 = 700 puis enlever le
droit d'exécution ==> 600 (ou rw−−−− −−−)
 

10. Créer un fichier nommé allperms et lui donner les droits d’accès 777 ;
Réponse (0.5 points) :
 
$ touch allperms
$ chmod 777 allperms
 

11. Définir votre umask à 471. Copiez allperms vers file1new. Quels sont les droits d’accès du fichier file1new ?
Réponse (0.75 points) :
 
$ umask 471
$ cp allperms file1new
file1new garde ses anciens droits (i.e 600)
 

12. Supprimer file1new et copier allperms vers ce fichier (file1new). Quels seront les droits d’accès de
file1new. Pouvez-vous modifier le contenu de file1new ? Pouvez-vous faire un cat sur ce fichier ?
Réponse (1.25 points) :
 
$ rm file1new
$ cp allperms file1new
file1new est nouvellement crée, ses droits d'accès seront : 777 − 471 = 206 ou −w−−−− rw−

é
oui on peut modifier (le propriétaire a le droit de modification (w)) mais on ne peut pas
ig
faire un cat (pas de droit de lecture pour le propriétaire)
 

13. Supprimez file1new. Supposons que vous vouliez que les droits d’accès de file1new soient 751. Que devez-
rr
vous définir comme umask avant de copier allperms vers file1new ?
Réponse (0.5 points) :
 
$ rm file1new
Co

Il n'y a pas de solution. Puisque chaque fichier nouvellement crée n'aura jamais le droit
d'exécution.
 

14. Supprimez file1new. Cette fois-ci, vous voulez que les droits d’accès de file1new soient 640. Quelles sont
les valeurs possibles de umask à utiliser avant de copier file1 vers file1new afin d’avoir ces droits d’accès
(Notez qu’ils existent plusieurs valeurs possibles que vous pouvez exprimer sous forme d’expression régulière) ?
Réponse (0.75 points) :
 
$ rm file1new
Le masque est calculé en utilisant l'opération inverse (777 − droits d'accès souhaités) :
777 − 640 = 137
Les autres masques sont calculés en considérant les droits associés à la création de
répertoire avec les droits 640 et aussi le droit d'exécution (740, 750, 751, 650, 651,
641). Ce qui donne les masques suivants : 037, 027, 026, 127, 126 et 137 ==> ou en
terme d'expression régulière [01][23][67]
 

Exercice 2 (4 points)
1. Ecrire un script Shell, avec un nombre quelconque de paramètres, affichant les numéros des paramètres dont
leurs valeurs sont supérieurs au premier paramètre.
Réponse (2 points) : Une solution parmi d’autres :
 
#!/bin/bash
if [ $# −ge 2 ]
then

2
par1=$1
shift
cpt=2
for i in $@
do
if [ $i −gt $1 ]
then
echo $cpt
fi
cpt=`expr $cpt + 1`
done
else
echo "Il faut au moins deux paramètres"
exit 1
fi
 

2. Ecrire un script Shell qui calcule le nombre de répertoires et le nombre de fichiers dans le répertoire courant et
affiche le résultat sous la forme :
 
Nombre de répertoires : xxx
Nombre de fichiers : xxx
 
Réponse (2 points) : Une solution parmi d’autres :
 
#!/bin/bash
nbRep=0
é
ig
nbFich=0
for f in *
do
−d $f ]
rr
if [
then
nbRep=`expr $nbRep + 1`
else
Co

nbFich=`expr $nbFich + 1`
fi
done
echo "Nombre de répertoires : $nbRep"
echo "Nombre de fichiers : $nbFich"
 

Exercice 3 (4.5 points)


Ecrire un script Shell affichant le menu suivant :

1. Créer un enregistrement

2. Afficher les enregistrements

3. Rechercher des enregistrements

• En choisissant l’option 1, le script demande à l’utilisateur six informations : nom, prénom, adresse, ville, région
et le code postal. Ces informations seront ajoutées à la fin d’un fichier texte names.dat (toutes sur une seule
ligne, séparées par le caractère ”:”) ;

• En choisissant l’option 2, le script affiche tous les enregistrements ainsi que leur nombre ;

• L’option 3 permet de rechercher les enregistrements contenant une chaine de caractère saisie par l’utilisateur ;

• Le script quitte si l’utilisateur entre une option différente de 1, 2 et 3 en affichant le message "Done".

3
 
#!/bin/bash
select choix in "Créer un enregistrement" "Afficher les enregistrements" "Rechercher des
enregistrements"
do
case $REPLY in
1) read −p "Donner les nom, prénom, adresse, ville, région et le code postal" NOM PRENOM
ADRESSE VILLE REGION CP
echo $NOM:$PRENOM:$ADRESSE:$VILLE:$REGION:$CP >> names.dat;;
2) cat names.dat; echo "Le nombre d'enregistrements est `cat names.dat | wc -l`";;
3) read −p "Chaine à rechercher ?" ch
grep $ch names.dat;;
*) echo "Done"; break ;;
esac
done
 

Exercice 4 (4 points)
Le fichier villes.csv (dont un extrait est reproduit ci-dessous) contient des informations sur les villes les plus peu-
plées dans le monde :
 
Abidjan,Côte Ivoire,Afrique,3300000,298
Ahmadabad,Inde,Asie,4525000,202
Alexandrie,Egypte,Afrique,4000000,293
. . . . .
. . . . .
Wuhan,Chine,Asie,4700000,712
é
ig
Xianc,Chine,Asie,3000000,531
 
Pour chaque question, indiquer les commandes unix permettant d’obtenir le résultat demandé.
rr
1. Afficher le nombre de villes du fichier villes.csv ;
Réponse (0.25 points) :
 
Solution 1 : $ cat villes.csv | wc −l
Co

Solution 2 : $ awk −F, 'END {print NR}' villes.csv


 

2. On dispose aussi d’un fichier entete.txt constitué des deux lignes suivantes indiquant la signification des
colonnes de villes.csv :
 
Ville,Pays,Continent,Population,Superficie
==========================================
 
Question : Constituer un fichier unique villes1.csv sous la forme suivante à partir des fichiers entete.txt
et villes.csv
Réponse (0.25 points) :
 
cat entete.txt villes.csv > villes1.csv
 
 
Ville,Pays,Continent,Population,Superficie
==========================================
Abidjan,Côte Ivoire,Afrique,3300000,298
Ahmadabad,Inde,Asie,4525000,202
Alexandrie,Egypte,Afrique,4000000,293
. . . . .
. . . . .
Wuhan,Chine,Asie,4700000,712
Xianc,Chine,Asie,3000000,531
 

4
3. Compter le nombre de villes africaines dans villes.csv ;
Réponse (0.75 points) :
 
$ awk −F, '$3~/Afrique/ {nbAfrique++} END {print "Nombre de villes africaines est : "
nbAfrique}' villes.csv
 

4. Afficher seulement les noms des villes et leur population ;


Réponse (0.5 points) :
 
$ awk −F, '{print $1, $4}' villes.csv
 

5. Afficher les informations sur les villes de plus de 10 millions d’habitants ;


Réponse (0.5 points) :
 
$ awk −F, '$4>=10000000 {print $0}' villes.csv
 

6. Afficher la population moyenne des villes asiatiques ;


Réponse (0.75 points) :
 
$ awk −F, '$4~/Asie/ {som+=$4; nb++} END {print som/nb}' villes.csv
 

7. Afficher le fichier avec une colonne supplémentaire donnant la densité de population de chaque ville (la taille
de la population divisée par la superficie).
Réponse (1 point) :
 
$ awk −F, 'BEGIN{OFS=","} {print $0, $4/$5}' villes.csv
 

é
ig
rr
Co

Vous aimerez peut-être aussi