Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 Lab2 : Introduction au système Unix –suite : les processus Objectifs: • Gestion des processus et surveillance de comportement. • Éditeur de texte Vi et programmes en C/C++ • Les appels fork(), exec() and Wait Deuxième série d’exercices sur Unix Partie 1 Tapez la commande qui permet de réaliser ce qui suit : 1. 2. 3. 4. 5. Afficher la liste des utilisateurs connectés au système. Afficher votre code utilisateur. Afficher le nom du répertoire courant. Afficher le contenu du répertoire courant. Créer un répertoire de nom laboratoire, afficher le contenu du répertoire courant et changer de répertoire pour passer à celui qui vient d’être créé. 6. Afficher le nom du répertoire courant puis son contenu. 7. Créer un fichier de nom fich1, en utilisant l’éditeur Vi (Annexe1), dont le contenu du fichier est : #include<iostream.h> #define long 180 int main () { char chaine [long]; cin.getline(chaine,long); cout<<chaine<<endl; return 0; } 8. Afficher le code de protection du fichier créé. 9. Ajouter la permission en exécution pour le propriétaire et le groupe. 10. Changer le nom du fichier en prog1.cpp. 11. Compiler le fichier avec la commande g++ -o prog1 prog1.cpp. Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 12. Exécuter le programme : prog1 13. Supprimer la permission en exécution du programme prog1.cpp pour le groupe. 14. Rediriger la sortie standard du programme vers un fichier nommé resultat. 15. Afficher le contenu de ce fichier. Partie 2 Que fait chacune des commandes suivantes : • • • • • • ls *.cpp file laboratoire ls|sort ls*/*.c ls|wc –w cat>>prog1.cpp //fin du programme ^D • grep cin prog1.cpp|wc –l • find . –name titi –print Partie 3 Écrire la commande qui permet d’afficher: • • • Les 2 premières lignes du fichier prog1.cpp. Les 3 dernières lignes du fichier prog1.cpp. La 4ème ligne du fichier prog1.cpp. Partie 4 1. Soit le script suivant : #!/bin/csh # Mon script d’exo clear while (1) echo "Menu" echo " Affichage repertoire courant 1" echo " Liste des fichiers du repertoire 2" echo " Informations sur un fichier 3" echo " Changement de repertoire 4" echo " n premieres lignes d'un fichier 5" Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 echo " Sortie 0" echo -n "Choix: " set choix=$< switch ($choix) case 0: exit(0) case 1: ?? ; breaksw case 2: ?? case 3: ?? case 4: ?? case 5: ?? default: echo "Choix non propose" endsw end Créez le fichier Menu qui sera exécuté sous le shell et programmez les différents éléments du menu. 2. Écrire un programme crcdrep qui crée un répertoire (dont le nom sera passé en paramètre) dans le répertoire courant et qui vous positionne dedans Partie 5 Qu’affiche chacun des segments de programmes suivants : 1. for (i=1 ; i<=4 ; i++ ) { pid = fork(); if(pid >0) printf(“%d”,pid); } 2. for (i=1 ; i<=4 ; i++ ) { pid = fork(); if(pid == 0) break; else printf(“%d”,pid); } Quel est le nombre de processus créés ? Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 Partie 6 Écrire un programme en C ou C++ qui lit à l’écran le nombre de fils à créer puis les crée l’un à la suite de l’autre. Chaque fils affiche à l’écran son pid (getpid()) et celui de son père (getppid()). Partie 7 Écrire un programme qui lance en créant un processus le programme prog2.cpp, puis se met en attente de la fin d’exécution du programme. NB. Deux annexes (A & B) sont à votre disposition afin résoudre les exercices ci-dessus. Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 Annexe A 1. Éditeurs Unix Plusieurs éditeurs fonctionnent sous Unix : emacs, vi, xedit, pico…. Mais vi est l’éditeur standard sur la majorité des systèmes UNIX. vi utilise deux modes : • Mode insertion : utilisé pour entrer du texte. • Mode de commandes : utilisé pour manipuler le fichier. Pour créer un fichier nomfich avec vi : • On lance la commande : vi nomfich • Appuyer sur la touche i pour passer en mode insertion • Taper le texte • Peser sur <Esc> pour passer en mode commandes • Pour la sauvegarde, appuyer sur les 3 touches :wq Pour plus d’informations sur cet éditeur, consulter le lien suivant : http://w3.uqah.uquebec.ca/DOC/unx_vi.html ou http://www.cs.fsu.edu/general/vimanual.html 2. Fichiers et répertoires Chaque utilisateur du système Unix est identifié par un numéro unique appelé UID (user identifier). Un utilisateur particulier, appelé le superviseur ou l’administrateur avec le UID = 0 possède des privilèges que les autres utilisateurs n’ont pas. Il peut accéder à tous les fichiers et effectuer certains appels systèmes réservés. Le système Unix offre la possibilité de constituer des groupes d’utilisateurs. Chaque groupe a un numéro unique appelé GID (group identifier). Les UID et GID d’un utilisateur servent, par exemple, à définir les droits d’accès aux fichiers de l’utilisateur. a. Permissions d’accès aux fichiers et aux répertoires Les fichiers sont regroupés dans des répertoires qui peuvent contenir aussi d’autres répertoires. Le système de fichiers UNIX représente donc une structure arborescente. Chaque fichier a un propriétaire (le créateur du fichier) et un groupe. Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 Pour contrôler les accès aux fichiers et aux répertoires, neuf (9) bits de protection ou bits de droits leur sont attribués. Les 3 premiers bits définissent les droits d’accès pour le propriétaire, les 3 autres pour le groupe (même département, …) et les 3 derniers bits pour l’ensemble des utilisateurs. Chaque groupe de 3 bits contrôle les accès en lecture(r), en écriture(w) et en exécution(x) pour les fichiers. En ce qui concerne les catalogues ou répertoires (qui sont aussi des fichiers) : • r : permet de lire les noms des fichiers • w : permet d’ajouter et de retirer des fichiers • x : permet la recherche dans un catalogue. Exemple : -rwxr-xrw- => permet la lecture, l’écriture et l’exécution pour le propriétaire, la lecture et l’exécution pour le groupe et la lecture et l’écriture pour les autres. Remarque : • • • On peut aussi transcrire l’écriture précédente en octal : 756. Le premier tiret à gauche des permissions indique que c’est un fichier. Pour indiquer un répertoire il y aura un d à la place du tiret. b. Modifications des permissions On peut donc pour une raison ou une autre, vouloir modifier ces permissions. L’appel système utilisé est la commande chmod. Cette commande a plusieurs formes, on peut, soit utiliser les codes r, w, x avec les codes u (utilisateur), g(groupe), o(autres), ou bien tout simplement utiliser les valeurs octales. Exemple : chmod go+rw lab1 : ajouterait au groupe et aux autres les permissions de lecture et d’écriture sur le fichier lab1. Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 chmod go=u-x lab1 : donnerait les mêmes permissions que l’utilisateur au groupe et aux autres sauf l’exécution. chmod 640 lab1 : donne les permissions de lecture et d’écriture à l’utilisateur, de lecture au groupe et aucune permission aux autres. c. Chemin d’accès absolu et relatif Il y a deux façons de spécifier les noms des fichiers en Unix. La première est le chemin d’accès absolu qui indique comment accéder au fichier à partir du répertoire racine. Le répertoire racine est spécifié par /. Exemple : /labo/inf3723/lab2 La deuxième façon est le chemin d’accès relatif, où le chemin est donné par rapport au répertoire de travail en cours. Exemple : si inf3723 est le répertoire en cours, les commandes : mv lab2 lab3 (ici les chemins sont relatifs) Et mv /labo/inf3723/lab2 /labo/inf3723/lab3 Font exactement la même chose. Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 Annexe B Les processus Les seules entités actives d’un système UNIX sont les processus et le seul moyen de créer des processus est de dupliquer un processus existant. Les appels systèmes d’Unix permettent la création, l’arrêt des processus, la communication et la synchronisation des processus. Mais tout d’abord définissons la structure de l’espace d’adressage du processus. Cet espace est constitué de 3 segments (texte, données et pile) : • • • Le segment de texte contient les instructions en langage machine (le code) produit par le compilateur et l’assembleur. Le segment de données contient l’espace de stockage des variables du programme. Il est divisé en deux parties : une pour les données initialisées et une autre pour les données non initialisées. La taille de cet espace peut augmenter ou diminuer durant l’exécution du programme. Le segment de pile contient au départ les variables d’environnement (shell) et la ligne de commande envoyée au shell pour demander l’exécution du programme. Un programme peut ainsi connaître ses paramètres. Les processus en Unix sont créés de façon très simple. L’appel système fork() crée une copie exacte du processus appelant qui est le processus père. La copie créée est le processus fils. Le père et le fils ont chacun leur propre image mémoire privée mais partage les fichiers qui sont ouverts. L’exécution des 2 programmes père et fils continue après l’appel du fork(). Le fait que les images mémoire, les variables et les registres soient identiques pour le père et pour le fils pose un problème : comment savoir quel processus est le père et lequel est le fils? Pour résoudre ce problème, l’appel système fork() retourne 0 dans le fils, une valeur supérieure à 0 qui est en fait le pid (process identifier) du fils, dans le père et une valeur inférieure à 0 si l’appel système a échoué. Un processus fils peut connaître son pid par l’appel système getpid() et il peut connaître celui de son père par l’appel système getppid(). Cette possibilité d’avoir des arbres de processus est la clé du fonctionnement d’Unix en temps partagé. Systèmes d’exploitation INF 3723—Automne 2008 Université du Québec en Outaouais – Département d'informatique et d’ingénierie – C.P. 1250 - Hull - Québec J8X 3X7 Téléphone: (819) 595-3900 Télécopieur: (819) 773-1638 États de processus