Home page UNIX

INTRODUCTION AU SYSTEME UNIX    

Chapîtres 1,2.

1 Présentation d'UNIX
1.1 Historique
1.2 Les Concepts Fondamentaux
1.3 Les Processus
1.4 Le Système de Gestion de Fichiers
1.4.1 Les Différents Types de Fichiers
1.4.2 Arborescences, Liens Physiques
1.4.3 Références Absolues et Références Relatives
1.4.4 Les Principaux Répertoires
1.4.5 Les Droits d'Accès et leur Gestion
2 Interpréteurs de Commandes
2.1 Connexion/Déconnexion
2.2 Syntaxe et Exécution d'une Commande
2.3 Aide en Ligne (man)
2.4 Quelques Commandes Utiles
2.5 Les Commandes de Manipulation de Fichiers
2.6 La Commande df
2.7 La Commande ps
2.8 Arrêt d'un Processus : la Commande kill
2.9 Les Redirections
2.10 Les Enchaînements de Processus
2.10.1 Enchaînement Séquentiel
2.10.2 Enchaînement Parallèle
2.10.3 Tâche de Fond
3 Éditeurs Standards
3.1 Les Éditeurs ed et sed
3.1.1 Adressage des Lignes
3.1.2 Commandes
3.1.3 L'Éditeur sed
3.2 L'Éditeur vi
3.2.1 Le Mode Insertion
3.2.2 Le Positionnement du Curseur
3.2.3 Recherche d'une Chaîne de Caractères
3.2.4 Ajuster l'Écran
3.2.5 Manipulation de Fichiers
3.2.6 Marquage de Texte
3.2.7 Modification de Texte
3.2.8 Copiage et Collage de Texte
3.2.9 Autres Commandes
4 Langage de Commande (Shell)
4.1 Commandes Externes et Commandes Internes
4.2 Shell, Login-Shell
4.3 Caractères Spéciaux
4.4 Expressions Rationnelles
4.4.1 Expressions Rationnelles Atomiques
4.4.2 Expressions Rationnelles
4.5 Le Login et l'Environnement Shell 4.6 Les Procédures et leurs Paramètres 4.7 Structures de Contrôle 5 Noyau Unix 6 Fichiers
6.1 Caractéristiques des Fichiers
6.2 Appels Systèmes Opérant sur les Fichiers
6.3 Communication entre Processus par Tubes
7 Processus
7.1 Caractéristiques des Processus
7.2 Gestion de Processus par le Système Unix
7.3 Appels Systèmes Opérant sur les Processus
7.3.1 Création de Processus
7.3.2 Fin d'un Processus
7.3.3 Attente de la Fin d'un Fils
7.3.4 Substitution
7.3.5 Quelques Primitives
7.4 Les Signaux
7.4.1 Caractéristiques des Signaux
7.4.2 Principaux Signaux
7.4.3 Appels Systèmes Associés aux Signaux

1 Présentation d'UNIX

1.1 Historique

UNIX créé au Laboratoire BELL, USA, en 1969 .

Destination : gestion d'un mini-ordinateur pour une petite équipe de programmeurs

intéresse rapidement de nombreuse universités puis des constructeurs

De nombreuses versions d'UNIX sont donc apparues :

LINUX sur PC, ULTRIX sur DIGITAL, SPIX sur BULL, et bien d'autres.

deux principales familles de systèmes UNIX : Berkeley et System V de Bell. De nombreux efforts de normalisation : norme System V , POSIX, OSF

1.2 Les Concepts Fondamentaux

système multi-utilisateurs et multi-tâches.

permet la répartition des ressources (mémoire, processeurs, espace disque, imprimantes, programmes et utilitaires) entre les utilisateurs et les tâches.

chaque utilisateur peut exécuter plusieurs programmes simultanément.

fournit des primitives pour construire des applications complexes à partir d'autres plus simples

Il est possible de rediriger les entrées et sorties des processus

Un mécanisme de communication par tubes permet de synchroniser des processus et de leur faire échanger des informations.

Un système UNIX est administré par un super-utilisateur ("superuser").

Le système comprend :

* un ensemble de fonctions de base appelé système (ou noyau ou "kernel"), assurant la gestion de la mémoire, des entrées/sorties de bas niveau, l'enchaînement des tâches ou processus ;

* un système de gestion de fichiers hiérarchisé ;

* des interpréteurs de commandes (shell, C-shell, Korn-shell, ...) disposant d'instructions et de structures de contrôle ;

* des utilitaires : compilateur C, éditeurs, logiciels réseau, générateurs d'analyseurs lexicaux et syntaxiques, ... ;

* un mécanisme d'interactions entre processus : les signaux ;

* un système de messagerie électronique.

1.3 Les Processus

Un processus UNIX est l'activité liée à l'exécution d'un programme ou de plusieurs programmes séquentiellement.

Tout processus dépend d'un utilisateur et est rattaché au terminal sur lequel l'utilisateur est logé, sauf les processus "systèmes"

Un utilisateur peut avoir plusieurs processus en cours à un instant donné.

la notion de processus est orthogonale à la notion de programme : demander deux exécutions successives ou parallèles d'un même programme crée deux processus différents

inversement un processus peut enchaîner l'exécution de deux programmes.

Les différents processus existant à un instant donné sont considérés comme indépendants et le processeur leur est attribué de façon imprévisible pour l'utilisateur.

1.4 Le Système de Gestion de Fichiers

1.4.1 Les Différents Types de Fichiers

* les fichiers ordinaires ou fichiers réguliers : programmes, données, ... Ces fichiers sont destinés à recevoir des données, des utilisateurs ou du système. Leur unité d'accès pour la lecture ou pour l'écriture est l'octet. Un utilisateur peux considérer les fichiers de données comme des tableaux de caractères munis d'un index de lecture/écriture ;

* les catalogues ou répertoires ("directory"). Les répertoires sont des fichiers de données particuliers utilisés par le système pour organiser les ensembles de fichiers qu'il doit gérer en une structure "arborescente". Le contenu d'un répertoire est une suite de couples formés d'un nom de fichier et d'un numéro (index par lequel le système identifie le descripteur d'un fichier dans la table des i-noeuds) ;

* les fichiers spéciaux : (utilisés pour spécifier les) périphériques. Ils se trouvent dans le catalogue /dev ("device") et sont référencés par un utilisateur comme des fichiers ordinaires.

1.4.2 Arborescences, Liens Physiques

On a un système de fichiers arborescent dont les noeuds sont les noms des catalogues non vides et les feuilles sont les noms des catalogues vides et des fichiers non catalogues. Chaque utilisateur dispose de sa propre sous-arborescence.

Il est possible de créer des noms "synonymes" qui permettent de désigner le même fichier avec deux noms placés dans des répertoires différents. Le synonyme d'un nom existant est appelé un lien physique.

Il existe également des liens symboliques.

Remarque :

La structure de fichiers n'est une arborescence, au sens de la théorie des graphes, que s'il n'y a pas de noms multiples. Dans le cas contraire c'est seulement un graphe fini quelconque.

1.4.3 Références Absolues et Références Relatives

Les fichiers sont désignés par des "références" qui doivent désigner de façon unique un seul fichier dans une arborescence.

La racine du système de fichiers est unique et est référencée par /. La référence absolue d'un fichier est /nom1/nom2/.../nomn.

La désignation par les références absolues est souvent fastidieuse . De plus, son utilisation dans les programmes fige l'arborescence.

Le catalogue de travail ("working directory") désigne le catalogue à partir duquel il faut à chaque instant rechercher d'autres fichiers par référence relative.

Tout répertoire contient deux références particulières, . et .., qui désignent respectivement le répertoire lui-même et son prédécesseur dans l'arborescence .

A chaque utilisateur est associé un catalogue privé ("home directory") qui est le catalogue de travail au login.

1.4.4 Les Principaux Répertoires

Les principaux répertoires ont les mêmes noms sur tous les systèmes UNIX :


* /bin et /usr/bin contiennent les programmes associés aux commandes UNIX non internes aux différents langages de commandes ;


* /dev contient les fichiers spéciaux ;


* /etc contient les fichiers système ;


* /tmp contient les fichiers temporaires.

.

1.4.5 Les Droits d'Accès et leur Gestion

Tout utilisateur possède un numéro d'utilisateur et le numéro du groupe auquel il appartient. On distingue trois types d'utilisateurs potentiels :

le propriétaire du fichier ("user", ou en abrégé u);
les utilisateurs appartenant au même groupe ("group", en abrégé g);
les autres utilisateurs ("other", en abrégé o).

Trois types d'opérations sur les fichiers sont possibles :

la lecture ("read", en abrégé r);
l'écriture ("write", en abrégé w);
l'exécution ("execute", en abrégé x).

Il y a donc 9 combinaisons possibles utilisateur-opération. C'est pourquoi les protections sont codées sur 9 bits.

.

2 Interpréteurs de Commandes

Un interpréteur de commande (ou "shell" en terminologie UNIX) est un processus lancé par le système UNIX lorsqu'un utilisateur se loge. Il est attaché au terminal qui sert à établir la connexion. Il est chargé de recueillir les commandes émises par l'utilisateur et si possible de les exécuter.

2.1 Connexion/Déconnexion

Une fois le terminal allumé , le message login : apparaît à l'écran. Il faut alors taper son nom d'utilisateur suivi de la touche <CR>. En réponse à la question suivante, i.e. password :, le mot de passe de l'utilisateur doit être composé. Le mot de passe est évidemment tapé en aveugle, pour que personne ne puisse le lire. Ensuite, un certain nombre d'informations sont affichées, suivies d'un caractère d'invite ("prompt") qui peut être le caractère $, le nom de la machine, ou autre chose, dépendant du site sur lequel on se trouve. Le "prompt" est envoyé par l'interpréteur du langage de commandes shell pour informer l'utilisateur qu'il est en attente de lecture de commandes.

Le système différencie les minuscules et les majuscules.

2.2 Syntaxe et Exécution d'une Commande

Une commande : nom arg1 arg2 ...

Les arguments qui sont des options ou des paramètres. Les différents éléments de la commande doivent être séparés par des blancs ou des caractères de tabulation.

Pour l'exécution d'une commande deux cas sont possibles :

soit le nom de l'action est le nom d'un fichier contenant un programme exécutable (commande interne),
soit l'action doit être exécutée par l'interpréteur de commandes lui-même(commandes interne).

* Pour les commandes internes l'interpréteur exécute la commande puis affiche le résultat et attend la commande suivante.

* Les commandes externes, qui correspondent à des fichiers exécutables sont utilisées pour avoir les interpréteurs les plus simples possibles et pour permettre de réutiliser des commandes développées pour un autre interpréteur

Exécution d'une commande externe

Il n'y a pas de différence apparente entre l'exécution d'une commande externe et l'exécution d'une commande interne.

2.3 Aide en Ligne (man)

man [section] titre

affiche page à page le chapitre correspondant au titre donné dans le manuel standard d'Unix. Certains titres se trouvent dans plusieurs sections.

Les commandes externes sont en section 1,
les appels système en section 2 et
les fonctions des bibliothèques standard en section 3.

man com

permet d'obtenir de la documentation sur la commande com.

man -k sujet

permet d'obtenir de la documentation sur le sujet, si il y en a

La touche h ("help"), on obtient un aide pour l'affichage page à page.

2.4 Quelques Commandes Utiles

* who affiche la liste des utilisateurs connectés.

* more nom_fichier affiche page à page le contenu de nom_fichier.

* find permet de trouver des fichiers dans l'arborescence.

- find / -name titi -print

cherche récursivement à partir de la racine tous les fichiers de nom titi et affiche leur référence absolue au fur et à mesure.

Critères de recherche : nom, permissions d'accès, type, nombre de références, propriétaire, groupe du propriétaire, taille, numéro de i-noeud, dates de création, de modification.
Ces critères peuvent être combinés à l'aide d'opérateurs logiques "et" et "ou".
Lorsqu'un fichiers a été trouvé , la commande find peut lui appliquer certaines opérations.

Quelques Commandes Utiles (suite)

* grep chaîne_caractères liste_noms_fichiers affiche, pour chaque fichier référencé dans liste_noms_fichiers, les lignes contenant chaîne_caractères.

* passwd permet de créer ou de changer le mot de passe.

* tty affiche le nom du terminal utilisé.

* wc [-lwc] [liste_noms_fichiers] ("word count") compte et affiche, pour tous les fichiers référencés dans liste_noms_fichiers le nombre de lignes, mots et caractères. Si aucun nom de fichier n'est précisé, la commande utilise l'entrée standard. L'option -l ("line") permet de n'afficher que le décompte des lignes, l'option -w ("word") celui des mots et l'option -c ("character") celui des caractères.

.

.

2.5 Les Commandes de Manipulation de Fichiers

* pwd ("print working directory") affiche la référence absolue du catalogue de travail.

* cd [nom_catalogue] ("change directory") change de catalogue de travail. Si aucun paramètre n'est fourni, le catalogue de travail devient le catalogue privé de l'utilisateur, sinon le catalogue de travail devient celui dont la référence est nom_catalogue.

* ls affiche la liste des fichiers dans le catalogue de travail. ls liste_références affiche, pour tout élément de liste_références qui référence un fichier ordinaire, son nom, et pour tout élément de liste_références qui référence un catalogue, son contenu. ls -l affiche aussi les protections, la taille, la date de dernière modification. ls -a permet de voir les fichiers dont le nom commence par un . (.cshrc et .login qui sont exécutés au login)

* cp [-i] ancien nouveau ("copy") effectue une copie physique d'un fichier dans un autre : création d'un nouvel i-noeud, d'une nouvelle entrée dans un catalogue et recopie effective du contenu du fichier ancien dans nouveau.

* ln fichier_existant fichier_nouveau ("link") crée un lien de nom fichier_nouveau sur fichier_existant .

* mv [-i] ancien_nom nouveau_nom ("move") renomme le fichier ancien_nom en nouveau_nom. L'option -i demande confirmation si nouveau_nom est le nom d'un fichier existant déjà (sinon il est écrasé).

* rm [-ir] liste_noms_fichiers ("remove") supprime, pour chaque nom de fichier dans liste_noms_fichiers, la référence du fichier. Le compteur de références de l'i-noeud correspondant est décrémenté de 1. L'i-noeud et le fichier physique ne sont détruits que si le compteur de références devient nul. L'option -i demande confirmation avant chaque suppression. L'option -r, permet de supprimer récursivement le contenu du catalogue puis le catalogue lui-même.

* mkdir liste_noms_catalogues ("make directory") crée les catalogues vides référencés dans liste_noms_catalogues.

* rmdir liste_noms_catalogues ("remove directory") pour chaque catalogue vide référencé dans liste_noms_catalogues, supprime le catalogue.

* chown [-R] nom_utilisateur[.nom_groupe] liste_noms_fichiers ("change owner") pour chaque fichier référencé dans liste_noms_fichiers, le propriétaire du fichier devient nom_utilisateur. L'option -R permet d'appliquer récursivement la commende aux catalogues de la liste.

* chmod [-R] nouvelles_protections liste_noms_fichiers ("change mode") pour chaque fichier référencé dans liste_noms_fichiers, le mode de protection devient nouvelles_protections.

Protections définies par rapport à : user, group, other
protections autorisent ( ou non) : read, write, execute

Les protections sont affichées par la commande ls -l sous la forme d'une chîne de 9 caractères : rwxrwxrwx qui indiquent les droit du propriétaire, du groupe et des autres, en lecture, ecriture et exécution. Si un caractère est remplacé par un - l'accès correspondant est refusé à la catégorie correspondante.

nouvelles_protections peut être exprimé de deux manières :
750 correspond en octal à rwxr-x--- (1 = autorisé, 0 = interdit)
ug+w rajoute les autorisations d'écriture au propriétaire et au groupe

2.6 La Commande df

L'espace physique sur le(s) disque(s) physique(s) est divisé en disques logiques référencés dans le catalogue des fichiers spéciaux. Chacun des disques logiques possède sa propre table d'index et sa propre racine. Les disques logiques peuvent être montés. Ils deviennent alors accessibles.

df [-i] [liste_noms_disques_logiques] ("display filesystem") affiche la taille des disques logiques montés, la place utilisée et disponible, le pourcentage de la capacité d'un disque logique déjà utilisé. L'option -i permet d'afficher le nombre d'i-noeuds utilisés et disponibles. On peut noter que la somme de la taille disque utilisée et de la taille disque disponible est plus petite que la taille totale du disque logique. Ceci est dû au fait que le système réserve une partie du disque logique (en général 10%) pour ne pas avoir de problème lors des allocations. Seuls un super-utilisateur et le système lui-même peuvent se servir de cette marge.

.

.

2.7 La Commande ps

ps [[-]acejlrSuvwx] [-tterm] affiche des informations sur les processus sous forme de tableau. -a permet de voir les processus des autres utilisateurs

colonne PID ("process identification") : numéro du processus concerné.
colonne TT ("terminal") : nom du terminal .
colonne TIME :temps CPU utilisé par le processus
colonne COMMAND : nom complet de la commande
colonne STAT ("status") : état du processusdécrit par 4 caractères
première lettre (indique l'état de fonctionnement du processus) :
R ("runable") processus en cours d'exécution;
T processus arrêté;
S ("sleep") processus en sommeil pour moins d'environ 20 secondes;
I ("idle") processus en sommeil pour plus d'environ 20 secondes;
Z ("zombie") processus ayant terminé qui attend que son père exécute une attente ("wait");
La seconde lettre (indique si un processus est swappé) :
La troisième lettre (indications sur la priorité du processus) :
La quatrième lettre indique des traitements particuliers mém. virtuelle.

2.8 Arrêt d'un Processus : la Commande kill

Les signaux sont un mécanisme permettant à un utilisateur ou au système d'avertir un processus qu'un événement particulier concernant ce processus s'est produit.

kill [-num] num_proc1 num_proc2 ... envoie le "signal de terminaison" aux processus de numéros num_proc1, num_proc2, ... L'option -num permet d'envoyer un autre signal dont la nature est spécifiée par le numéro est num plutôt que le "signal de terminaison". On utilise souvent le signal 9 ("signal tueur" ou SIGKILL) qui permet de tuer les processus en toutes circonstances.

Sur un grand nombre de systèmes UNIX, le même effet est obtenu, pour les processus qui ne s'exécutent pas en tâche de fond, en frappant CTRL-C (respectivement CTRL-\) qui provoque l'envoi d'un "signal de terminaison" (respectivement d'un "signal tueur"). Mais certains processus sont récalcitrants. Il n'y a alors pas d'autre possibilité que de se reloger pour utiliser la commande kill.

Pour des raisons évidentes, l'utilisation de la commande kill sur les processus d'un autre utilisateur est réservée à l'administrateur du système.

2.9 Les Redirections

Les entrées et sorties des processus se font a priori sur des canaux spécifiques. Il en existe trois :

* l'entrée standard qui est par defaut associée au clavier, ;

* la sortie standard qui est par défaut associée à l'écran du terminal;


* la sortie erreur standard qui est aussi par défaut associée à l'écran du terminal, sur laquelle le processus inscrit ses messages d'erreur.

On peut vouloir modifier les entrées/sorties d'un processus par exemple parce que les entrées sont contenues dans un fichier ou les sorties sont beaucoup trop longues pour qu'on puisse les voir à l'écran, et on préfère alors les mettre dans un fichier. Pour cela, on effectue une redirection du canal adéquat.

.

Redirection de l'entrée standard :

comm < nomfich la commande comm prend ses entrées dans le fichier nomfich.

Redirection de la sortie standard :

comm > nomfich redirige les sorties de la commande comm sur le fichier nomfich. Si ce fichier existe déjà, il est écrasé, sinon, il est créé;

comm >> nomfich redirige les sorties de la commande comm sur le fichier nomfich. Si ce fichier existe déjà, les sorties de la commande sont inscrites à la suite du contenu du fichier (donc sans écrasement), sinon, le fichier est créé.

Redirection de la sortie erreur standard :

comm 2> nomfich redirige les erreurs générées lors de l'exécution de la commande comm sur le fichier nomfich. Si ce fichier existe déjà, il est écrasé, sinon, il est créé.

2.10 Les Enchaînements de Processus

2.10.1

suite

2.10.2 Enchaînement Parallèle

Principe de fonctionnement d'un tube :

Enchaînement Parallèle suite

2.10.3 Tâche de Fond

comm& lance la commande comm en tâche de fond, l'interpréteur n'attend pas la fin de l'exécution de la commande et permet de relancer immédiatement une seconde commande. Le système affiche le numéro du processus créé.

Exécution d'une commande en tâche de fond :