Академический Документы
Профессиональный Документы
Культура Документы
SOMMAIRE
-1-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
-2-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
2- Historique
1969 : Ken Thompson écrit Unix en assembleur dans les laboratoires de Bell (AT&T)
1973 : Dennis Ritchie et Ken Thompson réécrivent Unix en langage C (seulement 10%
en assembleur)
1974 : Unix est distribué aux universités américaines
1975 : Première version d’unix commercialisée (licence pour le code source ; version 6)
1977 : Unix BSD (Berkeley Software Development) 1.0 de l’université de Berkeley au
Etats-Unis
1979 : Unix Version 7. Commercialisation d’une licence binaire (moins onéreuse que la
licence pour le code source)
1984 : Unix Système V
1991 : Unix OSF/1
-3-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
UNIX BSD, d’autre part l’UNIX Système V commercialisé par ATT. De nombreuses
autres versions ont vu le jour, qui sont le plus souvent une adaptation de BSD ou
Système V par un fabriquant particulier :
• AIX IBM, Bull (stations de travail, mainframes) ;
• HP/UX Hewlett-Packard (stations) ;
• SCO Unix SCO (PC) ;
• OSF/1 DEC ;
• Solaris Sun MicroSystems (stations Sun et PC) ;
• GNU/Linux Logiciel libre (et gratuit).
Ces différentes versions possèdent quelques incompatibilités. Pour y remédier, une
norme a été proposée par l’IEEE, le système POSIX. La plupart des versions modernes
d’UNIX sont des sur-ensembles de POSIX ; un programme écrit en respectant POSIX
sera donc portable sur toutes ces versions.
Les premières versions d’UNIX ne permettaient que le travail sur des terminaux
alphanumériques (il n’en existait pas d’autres à l’époque). Un grand pas en avant a été
fait avec le développement au MIT du système X Windows (X11).
Ce système permet le multifenêtrage sur écran graphique et le développement
d’interfaces utilisateurs sophistiquées et “conviviales” (inspirées du Macintosh).
De nombreux environnements graphiques sont maintenant disponibles : Motif,
OpenLook (Sun), KDE, Gnome, etc.
Linux est une version libre d’UNIX (le code source du système est disponible
gratuitement et redistribuable) qui connait actuellement un grand succès, tant chez les
utilisateurs particulier (en tant qu’alternative à Windows) que sur pour les serveurs
Internet/Intranet. Linux est diffusé par différentes sociétés ou organisations, sous formes
de distributions qui utilisent le même noyau (ou presque) et organisent de diverses
façons le système (packages, mises à jour, etc). Les distributions les plus répandues sont
Red Hat, Suse, Caldera, Debian, Slackware et Mandrake (à l’origine issue de Red Hat) et
s’adressent chacune à différents types d’utilisateurs
4- Architecture d’unix
Unix est un système d’exploitation
• d’usage général
• multi-utilisateurs
• multi-tâches
• interactif
• orienté temps partagé
• portable
• dont les systèmes de fichiers sont hiérarchisés en arbre
• qui offre une compatibilité totale des entrées/sorties (pour Unix, les
périphérique sont des fichiers)
• pour lequel il est très facile d’ajouter de nouvelles commandes sans modifier le
noyau (grâce à la grande puissance des langages des shells)
a- Noyau Unix
Le noyau est le programme qui assure la gestion de la mémoire, le partage du
processeur entre les différentes tâches à exécuter et les entrées/sorties de bas niveau. Il
est lancé au démarrage du système (le boot) et s’exécute jusqu’à son arrêt. C’est un
programme relativement petit, qui est chargé en mémoire principale.
-4-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
Le rôle principal du noyau est d’assurer une bonne répartition des ressources de
l’ordinateur (mémoire, processeur(s), espace disque, imprimante(s), accès réseaux) sans
intervention des utilisateurs. Il s’exécute en mode superviseur, c’est à dire qu’il a accès à
toutes les fonctionnalités de la machine : accès à toute la mémoire, et à tous les disques
connectés, manipulations des interruptions, etc.
Tous les autres programmes qui s’exécutent sur la machine fonctionnent en mode
utilisateur : il leur est interdit d’accéder directement au matériel et d’utiliser certaines
instructions. Chaque programme utilisateur n’a ainsi accès qu’à une certaine partie de la
mémoire principale, et il lui est impossible de lire ou écrire les zones mémoires
attribuées aux autres programmes.
Lorsque l’un de ces programmes désire accéder à une ressource gérée par le noyau, par
exemple pour effectuer une opération d’entrée/sortie, il exécute un appel système. Le
noyau exécute alors la fonction correspondante, après avoir vérifié que le programme
appelant est autorisé à la réaliser.
b- Shell
Le shell est l’interpr_teur de commandes. Quand un utilisateur tape des commandes
Unix, ces commandes sont lues par le shell qui effectue éventuellement des traitements
avant de lancer l’exécution de la commande. Le shell est une couche logicielle bien
séparée du noyau. Il existe plusieurs shells UNIX : C-Shell (csh ou tcsh), Bourne Shell
(sh ou bash), Korn shell (ksh), .... L’interprétation des commandes simples est semblable
pour tous ; par contre l’utilisation pour écrire des scripts diffère beaucoup (définition des
variables, structures de contrôle, etc).
Les variantes tcsh et bash apportent un plus grand confort d’utilisation en mode
interactif (historique, terminaison automatique des commandes, etc) ; tcsh est
compatible avec csh, et bash avec sh.
Le point commun à tous les shells est l’emploi d’une syntaxe concise mais obscure et
difficilement mémorisable, rendant leur apprentissage difficile (mais leur usage assez
divertissant à la longue !). Il est difficile d’administrer finement un système UNIX sans
posséder quelques bases sur sh et csh, car de nombreux scripts de configuration sont
écrits dans ces langages. La tendance actuelle est de généraliser l’emploi d’interfaces
graphiques, qui restent toutefois moins souples et puissantes que les scripts.
c- Les processus
UNIX est un système multi-tâches, ce qui signifie que plusieurs programmes peuvent
s’exécuter en même temps sur la même machine. Comme on ne dispose en général que
d’un processeur, à un instant donné un seul programme peut s’exécuter. Le noyau va
donc découper le temps en tranches (quelques millièmes de secondes) et attribuer
chaque tranche à un programme. On parle de système en temps partagé. Du point de
vue des programmes, tout se passe comme si l’on avait une exécution réellement en
parallèle. L’utilisateur voit s’exécuter ses programmes en même temps, mais d’autant
plus lentement qu’ils sont nombreux.
On appelle processus un programme en cours d’exécution. A un instant donné, un
processus peut être dans l’un des états suivants :
• actif : le processus s’exécute sur un processeur (il n’y a donc qu’un seul
processus actif en même temps sur une machine mono-processeur) ;
• prêt : le processus peut devenir actif dès que le processeur lui sera attribué par le
système ;
-5-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
d- Gestion de la mémoire
Le système UNIX fonctionne en mémoire virtuelle paginée. Ceci permet de faire
fonctionner des processus demandant une quantité d’espace mémoire supérieure à la
mémoire physique installée.
Lorsqu’un processus demande l’allocation d’une page de mémoire et qu’il n’y en a pas
de disponible en mémoire centrale, le noyau traite un défaut de page. Il choisit une
page (qui n’a pas été utilisé depuis longtemps) et l’écrit sur une partition spéciale du
disque dur. La place libérée est alors attribuée au processus demandeur.
Ce mécanisme demande la réservation d’une (ou plusieurs) partition spéciale sur l’un
des disques durs, nommée partition de swap. La mémoire disponible pour les processus
est donnée par la somme de la taille de mémoire physique (RAM) et des partitions de
swap. Bien entendu, les performances du système se dégradent lorsque la fréquence des
défauts de page augmente ; dans ce cas, il faut augmenter la mémoire physique.
-6-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
-7-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
a- Répertoire parent
Le répertoire parent est celui hiérarchiquement immédiatement supérieure à celui
courant. Il est noté « deux points » ..
b- Répertoire courant
On appelle répertoire courant celui dans lequel on se trouve à un instant donné durant
la navigation dans le système de fichiers. Il est noté point .
c- Chemin absolu
Le chemin absolu désigne la succession des répertoires à parcourir depuis la racine pour
accéder au fichier spécifié.
Exemple : /home/guest/fich1.C pour accéder au fichier fich1.c du système de fichier ou
qu'on se trouve dans le système (représenté dans le schéma plus-haut).
d- Chemin relatif
Le chemin relatif désigne la succession des répertoires à parcourir depuis le répertoire
courant pour accéder au fichier spécifié.
Exemple : ../fich1.c pour accéder au fichier fich1.c lorsqu'on se trouve dans le
répertoire guest. La présence du répertoire parent dans ce chemin relatif permet de
remonter dans l'arbre.
4- Types de fichiers
Nous appelons fichier tout point dans l’arborescence des fichiers. Tous ne
correspondent donc pas à des fichiers de données ordinaires. On distingue 4 types de
fichiers :
– les fichiers ordinaires, qui contiennent des données. UNIX ne fait aucune
différence entre les fichiers de texte et les fichiers binaires. Dans un fichier texte,
les lignes consécutives sont séparées par un seul caractère ’\n’.
– les répertoires, qui contiennent une liste de références à d’autres fichiers UNIX;
– les fichiers spéciaux, associés par exemple à des pilotes de périphériques ;
– les tubes et sockets, utilisés pour la communication entre processus ;
– les liens symboliques (fichiers “pointant” sur un autre fichier).
-8-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
Renommage
La commande mv <source> <destination> permet de renommer aussi bien un
fichier qu'un répertoire.
e- La commande ls
Utilisation
Utilisée dans options, la commande ls permet de lister le contenu du répertoire courant,
hormis les fichiers et répertoires cachés (ceux débutant par un .). Pour lister le contenu
d'un répertoire donné, son utilisation est ls <repertoire>.
Cette commande dispose de diverses options, dont les plus utilisées sont :
-a : affiche également les fichiers cachés ;
-l : affiche des informations supplémentaires sur les fichiers ;
-i : affiche les numéros d'i-node (utile pour vérifier les liens) ;
-s : affiche la taille en Ko de chaque fichier.
Il est également possible d'utiliser la commande ls sur un fichier et non pas sur un
répertoire.
Commande ls -l
Comme indiqué ci-dessus, l'option -l permet d'afficher des informations supplémentaires
sur les fichiers. Voici un exemple de sortie de la commande ls -l.
Chaque ligne s'interprète de la façon suivante :
• 1er caractère : indique le type du fichier (répertoire, fichier simple…) ;
• 9 caractères suivants : droits du fichier;
• 2nd champ : nombre de liens sur le fichier ;
• 3ème champ : propriétaire du fichier ;
• 4ème champ : groupe du fichier ;
• 5ème champ : taille en octets ;
• 6ème et 7émé champs : date de dernière modification ;
-9-
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
Droits d'accès
Concernant les droits sur les fichiers (1er champ, 2nd au 10ème caractère), ceux-ci sont
répartis de la façon suivante :
• Les 3 premiers caractères correspondent aux droits du propriétaire ;
• les 3 suivants aux droits du groupe ;
• les 3 suivants aux droits du reste des utilisateurs du système ;
• r correspond à un accès en lecture ;
• w correspond à un accès en écriture ;
• x correspond à un accès en exécution.
- 10 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
Lecture
L'accès en lecture autorise la lecture du fichier, c'est-à-dire qu'il est possible
d'éditer ce fichier avec une application quelconque pour en voir le contenu. Cet
accès est désigné par la lettre r (read).
Alloué à un répertoire, ce droit permet de lister les fichiers qu'il contient.
Ecriture
L'accès en écriture permet de modifier un fichier et de le supprimer. Il est
désigné par la lettre w (write).
Alloué à un répertoire, il autorise la modification et la suppression des fichiers
qu'il contient quelques soient les droits d'accès des fichiers de ce répertoire
(mêmes s'ils ne possèdent pas eux-même le droit en écriture). Donc attention!
Exécution
L'accès en exécution permet à un fichier exécutable d'être lancé et à un
répertoire d'être ouvert. Il est désigné par la lettre x (execute).
Pour qu'un programme puisse être exécuté, il est indispensable que le droit en
exécution sur ce fichier soit autorisé pour l'utilisateur qui souhaite le lancer.
Quant à un répertoire, il est tout aussi indispensable que son droit en exécution
soit autorisé pour qu'on puisse accéder aux fichiers qu'il contient.
Ce droit en exécution est sans effet lorsqu'il est affecté à un fichier qui n'est pas
un exécutable.
- 11 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
Pour chaque droit, on ajoute à convenance ces 3 chiffres pour former le chiffre
correspondant à la modification souhaitée (ex : 7 pour rwx). Enfin on combine ces 3
chiffres pour former un nombre à 3 chiffres qui correspond aux nouveaux droits du
fichier.
Si l'on reprend l'exemple suivant, pour autoriser l'accès en lecture/écriture pour le
propriétaire et en lecture pour le groupe et le reste du système à un fichier fichier1.txt, la
commande chmod s'utilise de la façon suivante avec la représentation octale des droits :
mlthioune@met_ubuntu:~$ chmod 544 fichier1.txt
mlthioune@met_ubuntu:~$ ls -l fichier1.txt
-r-xr--r-- 1 mlthioune admin 1121 2009-09-22 13:01 fichier1.txt
d- Commande umask
Afin de définir les droits d'accès à appliquer par défaut, on peut utiliser la commande
umask. Celle-ci se base sur la représentation octale vu précédemment.
Il s'agit de définir un masque qui sera retranché au masque maximal lors de la création
de fichiers ou de répertoires.
Pour les fichiers, le masque maximal est de 666. Ainsi, pour que tous les fichiers crées
le soient avec les droits définis en octal par le code 644 (soit rw-r--r--), il faut appliquer le
masque 022 : umask 022.
En ce qui concerne les répertoires, le masque maximal est de 777.
- 12 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
c- Commandes head
La commande head permet d'afficher le début du fichier passé en argument. Par défaut,
les 10 premières lignes sont affichées. head <fichier>
Les options utiles de head sont les suivantes :
-nX : affiche les X premières lignes du fichier ;
-cX : affiche les X premiers caractères du fichier.
d- Commande tail
A l'inverse de la commande head, la commande tail affiche la fin du fichier passé en
argument. Par défaut, les 10 premières lignes sont affichées. tail <fichier>
Les options utiles de tail sont les suivantes :
-nX : affiche les X dernières lignes du fichier ;
-cX : affiche les X derniers caractères du fichier.
-f : affiche les dernières lignes en continu, i.e. au fur et à mesure de l'évolution
du fichier (utile pour observer des fichiers de log).
- 13 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
e- Commande nl
La commande nl permet l'affichage du contenu d'un fichier et en numérote les lignes.
nl <fichier>
En voici les options :
- bt numérote les lignes non-vides (par défaut)
- ba numérote toutes les lignes
- bpXXX numérote seulement les lignes qui contiennent la chaîne de caractères XXX
- sX supprime le décalage du à la numérotation et utilise le séparateur X
- s'XXX' supprime le décalage du à la numérotation et utilise la chaîne 'XXX'
f- Commande wc
La commande wc permet de compter le nombre de caractères, de mots et de lignes d'un
fichier. wc <fichier> Ses options sont :
- l (Lignes) compte le nombre de lignes
- w (Words) compte le nombre de mots
- c (Chars) compte le nombre de caractères
- L (Length max ligne) affiche la longueur de la ligne la plus longue
- 14 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
2- Nom de l’ordinateur
La commande hostname affiche le nom de l’ordinateur sur lequel la commande
s’exécute.
- 15 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
du -s /home/methi
- 16 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
- 17 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
identifié par son PID, et le processus père par son numéro de processus
appelé PPID (Parent Process Identification).
Tous les processus sont ainsi identifiés par leur PID, mais aussi par le PPID du processus
qui l’a créé, car tous les processus ont été créés par un autre processus. Le seul qui ne
suit pas cette règle est le premier processus lancé sur le système le processus init qui n'a
pas de père et qui a pour PID 1.
3- Commandes
a- La commande top
La commande top vous permet d'afficher des informations en continu sur l'activité du
système. Elle permet surtout de suivre les ressources que les processus utilisent (quantité
de RAM, pourcentage de CPU, la durée de ce processus depuis son démarrage).
Vous pourrez utiliser l'option -d pour spécifier des délais de rafraîchissement (en
secondes).
En cours d'utilisation de top, il est possible de stopper un processus de manière
interactive en tapant k. top demande ensuite lequel signal il doit envoyer : 15
(SIGTERM) est le signal par défaut qui met fin à un processus, 9 (SIGKILL) est plus brutal.
Pour quitter top, appuyer simplement sur la touche "q".
b- La commande ps
La commande ps permet de connaître les processus actifs à un moment donné. Elle
affiche les détails de ces processus :
Une simple commande "ps" n'indique pas tous les processus du système. Le simple fait
de lancer ps indique juste les processus associés à un terminal et qui dépendent de
l'utilisateur courant.
En fait, il est tout a fait probable que d'autres processus non liés à un terminal aient été
lancés par l’utilisateur courant.
Pour avoir ces processus, on ajoute à ps l’option –x.
L'option ax permet de connaître tous les processus de tous les utilisateurs de la
machine. Si en plus on désire connaître les utilisateurs associés à chaque processus, il
vous suffit d'utiliser l'option aux. On verra alors plusieurs colonnes s'ajouter dont
"USER" qui indique à quel utilisateur appartient le processus.
"%CPU" indique en pourcentage les ressources du microprocesseur utilisées par le
processus.
"%MEM" montre en pourcentage les ressources en mémoire vive utilisées par le
processus.
"RSS" donne réellement la mémoire utilisée en kilobytes par le processus.
- 18 -
mlTHIOUNE
Programmation avancée sous Unix : Partie 1
c- La commande pstree
Cette commande permet d'afficher les processus sous forme d'arborescence et donc de
voir leurs dépendances.
d- La commande kill
La commande kill transmet des signaux à des processus (via leur PID) travaillant en
arrière-plan. Le plus connu (et sûrement le plus utilisé) de ces signaux est le signal 9
appelé KILL. Il arrête le processus.
Un utilisateur ne peut arrêter que les processus qui lui appartient (qu'il a lancés).
- 19 -
mlTHIOUNE