Présentation du système Linux

Julien Plu

Cette série d'articles parlera de tous les aspects que l'on pourra rencontrer lorsque l'on fait de la programmation système sous Linux en langage C. On y verra aussi l'utilisation des principales commandes ainsi qu'un petit cours sur le langage C. Ce cours est autant pour ceux qui ne connaissent pas Linux que pour ceux qui le connaissent et ont besoin d'un pense-bête. Le système d'exploitation utilisé sera Ubuntu 10.10 ce qui sous-entend l'utilisation de l'environnement de bureau GNOME. Commentez cet article : Commentez

Ce premier article consistera juste à présenter le système d'exploitation Linux.

Je tiens à dire que je ne ferai nullement ici l'apologie d'un quelconque système d'exploitation, Linux y compris. Tous les systèmes d'exploitation ont leurs qualités et leurs défauts il faut seulement savoir lequel utiliser en fonction de ce que l'on souhaite faire.

- Titre : Présentation du système Linux

- Auteur : Julien Plu

- Parution : 21 janvier 2011

- Public visé :

- Licence : Copyright ® 2010-2013 Julien Plu. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Qu'est-ce que Linux ?

- I-A. L'histoire de Linux

- I-B. Vue d'ensemble de Linux

- I-C. Quelques caractéristiques de Linux

- I-C-1. Linux est fiable

- I-C-2. Linux fonctionne partout

- I-C-3. Linux est gratuit

- I-C-4. Le support de Linux

- I-C-5. Linux n'a pas de registre

- I-C-6. Redémarrage du système

- I-C-7. L'interface graphique

- I-C-8. La défragmentation

- I-D. Comment se connecter

- I-D-1. Mode graphique

- I-D-2. Mode console

- I-E. A quoi ressemblent les commandes Linux ?

- I-F. Exemples de commandes

- I-F-1. La commande passwd

- I-F-2. La commande echo

- I-F-3. La commande date

- I-F-4. La commande who

- I-F-5. La commande tty

- I-F-6. La commande stty

- I-F-7. Les commandes incorrectes

- I-G. Comment se déconnecter

- I-G-1. Mode graphique

- I-G-2. Mode console

- II. Le système de fichiers

- II-A. Qu'est-ce donc ?

- II-B. Les fichiers et le répertoire de travail

- II-C. Les différentes sortes de fichiers existants

- II-C-1. Ordinaires

- II-C-2. Spéciaux

- II-C-3. Répertoires

- II-D. Les disques logiques

- II-E. La protection des fichiers

- II-F. Comment manipuler des fichiers ?

- II-F-1. Connaître le répertoire de travail : pwd

- II-F-2. Changer de répertoire de travail : cd

- II-F-3. Lister le contenu d'un répertoire : ls

- II-F-4. Afficher le contenu d'un fichier ordinaire : cat

- II-F-5. Copier un fichier : cp

- II-F-6. Créer un lien sur un fichier : ln

- II-F-7. Couper ou renommer un fichier : mv

- II-F-8. Supprimer un fichier : rm

- II-F-9. Créer un répertoire : mkdir

- II-F-10. Supprimer un répertoire : rmdir

- II-F-11. Changer les droits, le groupe et le propriétaire d'un fichier et d'un répertoire : chmod, chown, chgrp

- III. La gestion des processus sous LINUX

- III-A. Qu'est-ce qu'un processus ?

- III-B. Lister les processus actif : ps

- III-C. Interrompre un processus

- III-D. La redirection des fichiers standards

- III-E. Processus parallèles et communication

- III-F. Lancer un processus en arrière-plan

- III-G. Lancer un processus en mode détaché

- III-H. Interruption de processus, le retour

- IV. Remerciements

I - Qu'est-ce que Linux ?

I-A - L'histoire de Linux

L'histoire de Linux a commencé en 1991 avec le début du projet personnel d'un étudiant finlandais, Linus Torvalds, qui crée le noyau d'un nouveau système exploitation.

Avant de parler de Linux il serait bon de parler un peu de l'histoire du noyau Unix qui a été conçu et mis en oeuvre dans les années 1960 aux Bell Laboratories sous l'impulsion de Ken Thomson et d'un petit groupe de chercheurs de ces laboratoires pour ensuite être publié en 1969 pour un usage interne à ces laboratoires. Le développement du langage C par Dennis Ritchie a permis l'écriture d'une version d'Unix dans ce langage de haut niveau et par conséquent portable a priori sur tout type de machine disposant d'un compilateur de ce langage. Certaines universités américaines comme Berkeley notamment s'y intéressent énormément. Les laboratoires Bell/ATT voyant Unix devenir de plus en plus populaire et utilisé décident d'en assurer eux-mêmes le développement.

A côté des versions "orthodoxes" développées à partir du noyau fourni par les laboratoires Bell (V7, System III, Xenix, Spix...), un certain nombre de systèmes Unix-oïdes ont été développés par différentes sociétés. Notamment les deux plus importantes :

- Les versions que l'on peut rattacher à la souche Berkeley (version 4.2) ;

- Les versions se voulant du standard System V défini par les laboratoires Bell.

Il est d'ailleurs très important de noter les efforts importants faits pour normaliser le système, que ce soit par la publication de cette norme System V ou par les grands constructeurs européens regroupés dans le "Unix-Open-Group" qui a publié un document de normalisation assez proche de celui des Laboratoires Bell. Par ailleurs, un certain nombre de travaux sont réalisés un peu partout dans le monde (Berkeley, Ultrix de Digital ou Spix de Bull) pour fournir des versions du système possédant à la fois les fonctionnalités de la version System V et celles de la version de Berkeley en intégrant en particulier à la première le mécanisme de socket de la seconde. Par ailleurs, il faut signaler les efforts réalisés en France dans le cadre du GIPSI (groupement d'intérêt public regroupant Bull, le CENT et l'INRIA) pour développer une version multiprocesseur du système.

Maintenant que nous connaissons en gros l'histoire du système Unix, il devient important de parler du projet GNU. C'est en 1983 que Richard Stallman a commencé le projet GNU dans le but de pouvoir créer des systèmes d'exploitation UNIX-oide libres. Dans le cadre de ce travail il écrit aussi la GNU General Public License (GPL). Petite anecdote intéressante sur GNU, depuis le début des années 1990 il existe un noyau GNU nommé Hurd qui n'a malheureusement pas réussi à attirer suffisamment d'attention de la part des développeurs.

Cette fabuleuse histoire se poursuivra par un autre projet de système d'exploitation libre dans les années 1980 qui est la Berkeley Software Distribution (BSD). Cela a été développé par Berkeley à partir de la 6e édition d'Unix d'ATT.

Vient ensuite en 1987 le système d'exploitation toujours Unix-oide, Minix, créé par Andrew S. Tanenbaum pour un usage scolaire. Le principal défaut de ce système d'exploitation était qu'une partie du code ne pouvait être modifié et redistribué. En outre Minix16bits n'est pas très bien adapté aux machines 32bits qui sont très populaires pour les ordinateurs personnels à l'époque. C'est principalement à cause des petits défauts de Minix que Linus Torvalds a décidé de commencer son projet qui deviendra l'un des noyaux les plus utilisés au monde de nos jours. Petite anecdote amusante d'ailleurs Linux a été compilé avec GCC (GNU C Compiler) sur Minix. Il faut savoir qu'au départ Linux n'était qu'un simple émulateur de terminal qu'il utilisait pour accéder au serveur Unix de son université : il voulait utiliser, indépendamment d'un quelconque système d'exploitation, des fonctions de son ordinateur que Minix ne prenait pas en compte. La toute première version de Linux (0.01) était sous la licence personnelle de Linus Torvalds, plus tard pour la version 0.99 elle fut mise sous GPL, pour devenir le noyau que l'on connaît actuellement.

I-B - Vue d'ensemble de Linux

A partir de maintenant le terme Linux et Unix seront utilisés non plus pour désigner un noyau mais le système d'exploitation tournant autour de celui-ci.

Le système Linux est un système multi-utilisateurs et multi-tâches. En tant que système d'exploitation, son rôle principal est donc d'assurer aux différentes tâches et aux différents utilisateurs une bonne répartition des ressources de l'ordinateur (mémoire, processeur(s), espace disque, imprimante(s), programmes utilitaires...) et cela sans intervention des utilisateurs; il prend totalement en charge ces utilisateurs et lorsque les demandes sont trop importantes pour être satisfaites rapidement, l'utilisateur le ressent par un certain ralentissement (qui peut être effectivement important, voire insupportable...), mais le système (en principe) ne se bloque pas.

Linux est par ailleurs un système de développement et les utilisateurs y ont à leur disposition un très grand nombre d'outils, pour la plupart assez simples à utiliser, leur permettant d'écrire, de mettre au point et de documenter leurs programmes (éditeurs, compilateurs, débogueurs, système de traitement de textes...). Les utilisateurs ont ainsi à leur disposition une boîte à outils bien garnie, le principal problème qui se pose à eux étant de savoir ce qu'elle contient exactement et à quoi sert chacun de ces outils !

En résumé, on peut dire que le système est composé de :

- un noyau assurant la gestion de la mémoire et des entrées-sorties de bas niveau et l'enchaînement des différentes tâches ;

- un (ou plusieurs) interpréteur(s) de langage de commandes; il existe en effet différents langages de commandes nommés Shell, le plus connu étant le Bourne Shell (du nom de son auteur), un autre étant le C-Shell développé à l'université de Berkeley et le plus répandu actuellement étant le Bash. Nous verrons dans ce tutoriel un cours de Bourne Shell et de Bash. Il est important de noter que, quelle que soit la version du langage de commandes utilisée, il s'agit d'un véritable langage de programmation possédant des instructions et surtout des structures de contrôle de très grande puissance ;

- un système de messagerie assez complet (courrier, conversation en temps réel, journal de bord) ;

- un grand nombre de programmes utilitaires dont évidemment un compilateur de langage C, des éditeurs, des outils de traitement de textes, des logiciels de communication avec d'autres systèmes Linux (ou autres), des générateurs d'analyseurs lexicaux et syntaxiques...

I-C - Quelques caractéristiques de Linux

I-C-1 - Linux est fiable

L'écran bleu de Windows n'existe pas sous Linux. Les systèmes Linux et Unix peuvent fonctionner pendant des années sans échec (Windows aussi mais tout dépend aussi l'utilisation que vous en faites). L'équivalent des écrans bleu sur Linux se nomme Kernel Panic et est extrêmement rare et est à 99% du temps dus à une fausse manipulation de l'utilisateur (ce qui est très fréquent lorsque l'on ne maîtrise pas son fonctionnement par exemple avec une mauvaise manipulation d'une commande dangereuse comme rm). De nombreux utilisateurs de Linux n'ont jamais vu cette erreur. Et d'autres en voient fréquemment parfois même sans qu'ils y soient pour quelque chose.

Cette fiabilité est due à son noyau qui, d'après plusieurs études, contient bien moins de bogues que ses concurrents propriétaires. Ceci montre que les projets open sources sont généralement moins sources de bogues que les logiciels propriétaires. Mais attention extrêmement fiable ne veut pas dire 100%, des bogues existent toujours et vous ne serez jamais à l'abri, un jour peut-être, d'une mauvaise surprise.

Petit conseil par expérience, avant de toucher un quelconque fichier de configuration sous Linux il est IMPERATIF de sauvegarder quelque part le fichier d'origine et surtout avant de procéder à n'importe quel changement, soyez sûr et certain de ce que vous modifiez, sinon de graves conséquences sur le système seront inévitables et c'est donc ainsi que le système devient non fiable car vous avez créé une faille de sécurité, un bogue qui ne vous permettra plus de faire certaines choses, un plantage complet de la machine, un arrêt brutal de l'affichage, etc.

Il faut aussi savoir que les virus sont vraiment très rares sous Linux contrairement à Windows. Mais attention il existe malgré tout beaucoup de menaces sous Linux. Ceci est due au fait que les exécutables tel que vous les connaissez sous Windows n'existent pas sous Linux.

I-C-2 - Linux fonctionne partout

L'efficacité de Linux et de tous les Unix-oïdes peut être utilisée sur pratiquement tous les ordinateurs même les plus vieux. Il en va de même pour beaucoup d'applications. Par contre, certaines applications peuvent recommander un certain taux de performance. Si jamais vous avez un vieux P.C. qui traîne, au lieu de le laisser à la poussière dans un coin, mettez-y Linux et vous pourrez recommencer à vous en servir.

Il faut savoir aussi qu'il existe maintenant ce que l'on appelle les live-CD qui sont intégrés à toutes (ou du moins quasiment toutes) les distributions Linux. Ceci vous permet d'avoir sur un CD à la fois le programme d'installation sur votre disque dur du système d'exploitation mais surtout (et c'est là l'intérêt du live-CD !!) d'utiliser Linux sans rien installer du tout sur votre disque dur.

Mais attention il y a des limites à cette possibilité, il faut savoir que l'utilisation d'un live-CD n'est pas faite pour une utilisation intensive de Linux (serveur, développement, etc.) vous ne pourrez d'ailleurs rien installer et les performances ne seront pas géniales vu que tout se passe non pas sur le disque dur mais dans la RAM. Le live-CD est donc fait pour une simple découverte du monde Linux c'est-à-dire se familiariser avec l'environnement de Bureau et comment on l'utilise par exemple. Une autre utilisation des live-CD est la possibilité d'effectuer des réparations ou des récupérations de données sur les disques durs qui, par exemple, ont un problème de boot.

I-C-3 - Linux est gratuit

Vous pouvez télécharger Linux sur Internet et l'installer sur autant de machines que vous le voulez, ainsi que les applications. Il est possible aussi, pour beaucoup de distributions de commander le CD/DVD de la distribution. A noter aussi qu'il y a des distributions payantes mais ce sont des distributions réservées aux professionnels et entreprises.

Il faut savoir que ceci est dû au fait que le développement des distributions Linux est fait en open source. Par contre gratuit est un grand mot. Il faut savoir qu'il y a principalement quatre moyens d'acquérir une distribution Linux :

- en la téléchargeant, ceci est totalement gratuit (sauf si vous comptez le prix de votre abonnement Internet) ;

- en achetant un magazine spécialisé sur Linux (ces magazines contiennent toujours une distribution sur le CD qui est fourni avec) et ainsi vous payez le prix du magazine ;

- en achetant la distribution dans un magasin spécialisé et dans ce cas, vous payerez le prix proposé par le magasin en question ;

- en commandant un CD/DVD à l'éditeur de la distribution, ici par contre cela peut être gratuit ou bien alors payant suivant l'éditeur et la manière dont vous faites votre commande.

I-C-4 - Le support de Linux

Linux est aujourd'hui le système regroupant une grosse communauté. Tout ça grâce à Internet. Vous pouvez obtenir de l'aide de plusieurs dizaines de milliers d'utilisateurs Linux et programmeurs bénévoles sur Internet. Le support est gratuit (pour les distributions non professionnelles).

Je pense que le site de developpez.com en est un très bon exemple. Mais il y en a bien d'autres, il suffit de questionner un peu votre moteur de recherche préféré. Par contre, il faut aussi aimer l'anglais, car ce qu'il faut savoir, c'est que la plupart des tutoriels ou articles concernant Linux sont malheureusement dans la langue de Shakespeare, désolé pour ceux qui ont cette langue en horreur.

Par contre pour ce qui concerne les distributions professionnelles en général, c'est dans un forfait mais il se peut aussi que le support soit offert si vous êtes partenaire de l'entreprise qui développe la distribution. Mais là aussi, suivant l'entreprise à laquelle vous achetez votre distribution, il se peut qu'il faille savoir parler anglais pour discuter avec la personne chargée du support ou bien pour lire les aides qu'elle fournit.

Eh oui, si vous ne l'avez pas encore compris, si vous voulez travailler dans l'informatique il est impératif de savoir parler anglais.

I-C-5 - Linux n'a pas de registre

Lorsque Microsoft a introduit le registre dans Windows 95 il a été applaudi pour ce mécanisme qui a vocation d'éliminer la gestion d'un système avec les fichiers .ini de Windows 3.x. Linux, lui, est géré par de simples fichiers de texte brut pour sa configuration.

Il faut quand même dire que c'est beaucoup plus pratique mais aussi plus dangereux car on est moins à l'abri d'une fausse manipulation. Par contre, le fait d'instaurer un fichier de configuration pour chaque partie ou programme est quand même très sympathique car l'on sait exactement ce que l'on essaie de modifier et on n'a pas ainsi cette hiérarchie catastrophique du registre Windows où on ne sait jamais où se trouve ce que l'on cherche.

Mais je vous rassure pour beaucoup de programmes, ainsi que pour le système d'exploitation lui-même, il existe des outils permettant d'automatiser ou de fortement simplifier la configuration de ceux-ci. De cette manière vous ne serez pas obligé d'apprendre une notation compliquée qui caractérise très souvent les fichiers de configuration Linux. Par contre, ces outils dans la majeure partie ne permettent pas d'instaurer des paramètres de configuration très poussés il faudra donc à ce moment précis vous y mettre avec vos petites mains.

I-C-6 - Redémarrage du système

La plupart des changements de configurations de Windows requièrent un redémarrage (mise à jour comprise), cela peut être vite embêtant lorsque la machine est un serveur. Sous Linux rares sont les changements qui requièrent un redémarrage, ceci permet d'effectuer des changements sur votre serveur sans affecter leurs utilisateurs. Quand je parle de mise à jour je parle bien évidemment de mises à jour proposées par votre distribution.

Il faut savoir que ceci est dû à la non-utilisation de registre et que sous Linux ce sont seulement des fichiers qui sont modifiés et donc un simple redémarrage des services suffit. Alors que sous Windows, les mises à jour consistent les trois quarts du temps à modifier le registre et comme la prise en compte n'est pas dynamique, il faut le redémarrage du système pour que les nouveaux paramètres soient pris en compte. En général sous Linux seules les mises à jour du noyau requièrent un redémarrage du système.

Il faut bien avouer que, vu la fréquence des mises à jour sous Linux tous les jours, contrairement à Windows, une fois par mois, s'il fallait redémarrer son ordinateur tous les jours cela deviendrait très vite un véritable calvaire.

I-C-7 - L'interface graphique

Windows a toujours été fourni avec une interface graphique. Pourtant certains serveurs (Web, fichiers, BDD,...) n'ont aucunement besoin d'une interface graphique et de cette façon des ressources sont occupées pour rien. L'interface graphique Linux (X Window) est un sous-système facultatif que vous pouvez choisir d'utiliser ou non. En outre, vous pouvez démarrer et arrêter l'interface graphique quand vous le souhaitez sans avoir à redémarrer le système et sans avoir un quelconque effet sur les programmes en cours d'exécution.

Il faut savoir que sous Windows il n'existe qu'un seul environnement de bureau possible par défaut (on peut en installer d'autres mais ils sont très peu). Alors que sous Linux, il en existe plusieurs (KDE, GNOME, XFCE, etc.). On peut les combiner, c'est-à-dire choisir à l'ouverture de sa session le type d'environnement que l'on souhaite.

Par contre vous trouverez toujours des gens pour vous dire que tel ou tel environnement est mieux qu'un autre (le plus fréquemment entre GNOME et KDE). Mais la seule façon d'être sûr d'utiliser le bon est de les tester et de prendre celui avec lequel vous vous sentez le plus à l'aise.

I-C-8 - La défragmentation

Toutes les versions de Windows souffrent du même problème, la fragmentation du disque. Ceci réduit considérablement les performances. Linux, lui, ne fragmente pas les données sur le disque et est ainsi plus apte à être un serveur de fichiers que Windows.

En fait, il est incorrect de dire qu'il n'en existe pas, mais il conviendra d'insister sur le fait qu'elles sont le plus souvent totalement inutiles.

Il est vrai que les systèmes de fichiers Linux font un usage optimisé de l'espace, mais il n'est malheureusement pas en mesure de savoir aujourd'hui quelle sera l'organisation optimale de votre disque après une ou deux années d'usage intensif. Pour résumer, si vos disques durs ont une durée de vie supérieure à environ deux ans, que vous travaillez régulièrement dessus, que vous manipulez quotidiennement de gros fichiers (vidéos, morceaux de musique, etc.), que vous vous livrez au P2P ou encore qu'il vous arrive d'exhumer de vieux (et gros !) fichiers pour retravailler dessus, vous ressentirez vite, comme tout le monde, le besoin de défragmenter votre disque Linux !

Pour mieux comprendre ce système de fragmentation, je vous renvoie aux articles sur les différents systèmes de fichiers existant sous Wikipédia qui sont vraiment très bien faits. Ceci juste pour vous dire que l'on oublie vraiment très souvent que Linux ne fragmente PRESQUE pas les données contenues sur le disque dur.

I-D - Comment se connecter

I-D-1 - Mode graphique

Lorsque vous démarrez Linux vous tomberez sur une interface avec deux champs. Un pour votre login et l'autre pour votre mot de passe. Renseignez ces deux informations pour vous connecter au système.

I-D-2 - Mode console

Certaines distributions Linux ne démarrent pas directement avec l'interface graphique et vous serez donc amené à vous connecter via le terminal. Vous verrez ceci à l'écran :

Entrez votre login et une fois que vous avez appuyé sur ENTRÉE, entrez votre mot de passe (si vous ne voyez pas de caractère s'afficher à l'écran c'est tout à fait normal ne vous inquiétez pas) et appuyez encore sur ENTRÉE.

I-E - A quoi ressemblent les commandes Linux ?

Sous Linux, l'utilisateur dispose de nombreuses commandes dont on trouvera une liste des plus utiles un peu plus tard. Une commande se compose du nom proprement dit de cette commande (un simple mot), suivi éventuellement d'un ou plusieurs arguments (fournissant des informations supplémentaires : options ou paramètres), les différents éléments de la commande étant séparés par des espaces ou des caractères de tabulation; la commande complète est elle-même terminée par l'appui sur la touche ENTRÉE. Il faut en effet savoir que chaque ligne entrée au clavier est mémorisée et n'est effectivement interprétée que lorsqu'elle est complète, c'est-à-dire à la réception du caractère de fin de ligne; ce mode de fonctionnement est appelé canonique. Il offre en particulier l'avantage de permettre l'annulation de caractères de la ligne en cours de frappe avant son interprétation. Une possibilité offerte est de modifier ce mode de fonctionnement afin par exemple que chaque caractère tapé soit interprété immédiatement. Il faut aussi noter dès à présent que Linux accepte la frappe anticipée de caractères, c'est-à-dire qu'il est possible de taper des commandes sans avoir la main (c'est-à-dire, alors que le "prompt" $ ou >> n'est pas apparu, le système étant par exemple en cours d'exécution de commandes ou même en cours d'impression).

Les résultats des commandes sont, comme nous l'avons déjà dit, affichés sur la sortie standard et les données nécessaires à la commande lues sur l'entrée standard toutes deux par défaut (c'est-à-dire sauf demande contraire) physiquement associées au terminal d'où la commande est lancée.

Au cours de la procédure d'identification ("login") en mode console ou au cours d'une session de travail, si le mode de fonctionnement est canonique, un certain nombre de caractères jouent un rôle particulier en ce sens qu'ils permettent d'annuler tout ou partie de la ligne en cours de frappe :

- la touche BACKSPACE ou la combinaison CTRL+H annule le dernier caractère tapé ;

- la combinaison CTRL+U annule tout ce qui précède sur la ligne.

I-F - Exemples de commandes

Nous allons voir ici quelques exemples de petites commandes simples, histoire que vous puissiez vous familiariser un peu avec ce système de commande.

I-F-1 - La commande passwd

Elle permet à un utilisateur de créer ou de changer son mot de passe :

Le système demande tout d'abord l'ancien mot de passe de l'utilisateur, puis demande deux fois le nouveau mot de passe choisi. Il n'y a naturellement pas d'écho des mots de passe frappés par l'utilisateur pour des raisons évidentes de sécurité.

I-F-2 - La commande echo

Elle affiche la liste des paramètres sur la sortie standard, c'est-à-dire la chaîne de caractères qui suit echo :

I-F-3 - La commande date

On obtient la date dans la langue de configuration du système, ici en français :

Avant il existait une commande date par type de date (anglo-saxon, français...) mais maintenant cette commande s'adapte à la langue et à la région que l'on a choisies lors de l'installation de Linux.

I-F-4 - La commande who

Elle permet, utilisée sans paramètre, de connaître la liste des utilisateurs effectivement en train de travailler; utilisée avec les paramètres am et i, elle permet aux amnésiques de retrouver leur nom d'identification ainsi que le numéro du terminal sur lequel ils se sont connectés et l'heure à laquelle ils se sont connectés :

Je vous laisse cette commande avec les paramètres indiqués à essayer chez vous pour que vous puissiez voir à quoi elle ressemble.

I-F-5 - La commande tty

Elle donne le nom complet du terminal associé à l'utilisateur et le message not a tty si aucun terminal n'est associé :

I-F-6 - La commande stty

Elle permet d'une part de connaître les paramètres régissant la liaison entre le terminal et l'ordinateur et d'autre part de modifier leurs valeurs. L'option -a permet d'obtenir l'ensemble des valeurs des paramètres.

Sans l'option -a :

Avec l'option -a :

I-F-7 - Les commandes incorrectes

Ici la commande donnée n'est pas une commande reconnue par l'interpréteur. D'un autre côté, le nom d'une commande peut être correct et les paramètres ne pas l'être :

Dans cet exemple, on obtient les formes correctes permettant d'utiliser la commande que l'on avait donnée sous une forme incorrecte.

Dans ce dernier exemple, le système ne reconnaît pas la commande, car pour lui elle n'existe pas, mais elle peut être installée pour être ensuite utilisée et il nous indique le nom du (ou des) paquet contenant la commande que l'on a essayé d'entrer.

Petite information extrêmement utile pour la suite de votre apprentissage. Il existe un nombre vraiment très important de commandes et je ne vais pas toutes les détailler ici. Pour avoir vraiment tous les détails sur une commande, il vous faut utiliser la commande man dans votre terminal. Qui s'utilise de cette manière man "nomCommande".

I-G - Comment se déconnecter

I-G-1 - Mode graphique

Vous pouvez vous déconnecter en mode graphique en cliquant sur Déconnexion dans le menu K.

I-G-2 - Mode console

Il suffit tout simplement ici d'entrer cette commande :

sudo pkill -KILL -u {username}

Bien entendu il faut que vous remplaciez {username} par votre login.

Il faut savoir aussi que cette commande marche pour déconnecter n'importe quel utilisateur connecté sur la machine.

II - Le système de fichiers

II-A - Qu'est-ce donc ?

Un fichier LINUX est une chaîne de caractères non structurée (du point de vue du système) : le système ne possède aucune notion d'organisation de fichiers (séquentielle, indexée, partitionnée...).

A tout fichier est associé un bloc d'informations, appelé i-noeud (noeud d'index, ou index-node ou i-node) contenant un certain nombre d'informations d'ordre général concernant le fichier :

- sa taille ;

- l'adresse des blocs utilisés sur le disque pour ce fichier ;

- l'identification de son propriétaire et ses droits d'accès par les différents utilisateurs ;

- son type (fichier ordinaire ou spécial, catalogue...) ;

- un compteur de ses références dans le système ;

- un certain nombre de dates relatives aux principales opérations réalisables sur le fichier (consultation, modification...); les dates sont codées par un entier (nombre de secondes écoulées depuis le 1er janvier 1970).

Ce bloc d'informations ne contient aucun nom pour le fichier. La désignation d'un fichier se fait par l'intermédiaire de répertoires (directories) : un répertoire est un fichier dont le contenu est une suite de couples formés d'un numéro (un index par lequel le système identifie le fichier) et d'un nom par lequel le fichier est identifié dans le répertoire.

Ainsi un fichier peut être référencé par l'intermédiaire d'un répertoire et d'un nom dans ce répertoire. Il est possible de référencer un même fichier sous des noms différents dans des répertoires différents. Le nombre des références à un fichier est comptabilisé dans le compteur des références du i-noeud de ce fichier, un fichier n'étant effectivement détruit (c'est-à-dire l'espace nécessaire pour stocker son contenu et le i-noeud correspondant effectivement récupéré par le système) que lorsque le compteur de références du i-noeud du fichier devient nul. Aussi, la désignation d'un fichier nécessite-t-elle celle d'un répertoire et d'un nom dans celui-ci, le répertoire étant lui-même désigné par un nom dans un autre répertoire, etc.

Ce procédé de désignation est initialisé par l'existence d'un fichier sans nom dont la localisation est connue du système : il s'agit de la racine absolue du système de fichiers (index 2 dans le disque système).

Il faut savoir que sous Linux seuls les index de 1 à 10 sont réservés, on peut citer par exemple :

II-B - Les fichiers et le répertoire de travail

Soit un système sur lequel la racine du système de fichiers (d'index 2) contient entre autres choses les noms de deux répertoires usr et bin et leurs numéros respectifs (ici 524295 et 131075), le sous-répertoire bin contenant en particulier les couples (ls, 131150), (rm, 131191), (echo, 131120) correspondant aux programmes associés à des utilitaires du système; supposons que le répertoire usr contienne quant à lui le couple (bin, 524391). Ce sous-répertoire bin durépertoire usr contient lui aussi un certain nombre de fichiers ordinaires associés à des commandes du système. Le sous-répertoire home contient en particulier le couple (snake, 262148) correspondant à un répertoire. Enfin le répertoire snake contient à la fois des fichiers ordinaires et le couple (cpp, 262160) correspondant à un répertoire contenant lui-même des références à des fichiers ordinaires, par exemple (main.cpp, 271215). Cette hiérarchie peut être représentée par la structure suivante :

bin
524295 ---------- 524391
/
/
/usr
/
/   home          snake            cpp            main.cpp
/ 2----------262145----------262148-----------262160-----------271215
\
\bin      131150
\        /
\      /ls
\    /     rm
131075----------131191
\
\
\echo
\
\
131120

Le système de fichiers a donc une structure d'arborescence (graphe sans circuit qui de plus doit être connexe si le système est consistant !).

La racine de cette arborescence est la racine du système de fichiers et les feuilles en sont des fichiers non-répertoires ou des répertoires vides.

Pour tout fichier, il existe (si le système est consistant), au moins un chemin de la racine vers ce fichier, et la liste des noms étiquetant les arêtes de ce chemin identifie sans aucune ambiguïté ce fichier; il s'agit d'un nom ou référence absolue qui s'écrit symboliquement /nom1/nom2/.../nomp, où nom1, nom2..., nomp sont les noms rencontrés dans l'ordre de la racine vers le noeud correspondant de l'arborescence. La racine a pour référence absolue /.

Sur l'exemple, le fichier numéro 271215 a comme référence absolue (il peut en avoir d'autres)/home/snake/cpp/main.cpp.

Afin de faciliter les repérages, à tout instant un utilisateur dispose d'un répertoire privilégié appelé répertoire de travail par rapport auquel il lui est possible de réaliser des repérages relatifs. Ce répertoire de travail est utilisé par le système dans ce cas pour préfixer les repères : par convention, une référence relative est une référence ne commençant pas par le caractère /.

Ainsi, sur l'exemple précédent et si le répertoire de travail est /home/snake, le même fichier peut être désigné par cpp/main.cpp.

Les repérages sont encore facilités par le fait que tout répertoire contient les deux références particulières . et .. qui désignent respectivement le répertoire lui-même et son père (le répertoire unique dans lequel il est référencé). Ainsi le compteur des références de tout répertoire est au moins égal à deux, puisque le répertoire est référencé par le nom que lui a donné son propriétaire dans le répertoire père et par le nom . dans lui-même. On peut même dire plus : le i-noeud de tout répertoire père de n sous-répertoires a un compteur de références égal à n + 2.

Sur l'exemple, le répertoire de travail étant maintenant /home/snake, le même fichier pourra être référencé par ../snake/cpp/main.cpp.

Enfin, chaque utilisateur possède un répertoire particulier que nous appellerons son répertoire privé qui devient automatiquement son répertoire de travail dès l'ouverture de la session. Il est instructif à ce propos de consulter le fichier /etc/passwd qui contient entre autres choses la liste des identifications des utilisateurs, leurs mots de passe codés et la référence absolue de ce répertoire particulier.

II-C - Les différentes sortes de fichiers existants

Les fichiers peuvent être en première approche regroupés en trois grandes catégories.

II-C-1 - Ordinaires

Ce sont les fichiers qui contiennent des programmes (binaires ou sources), des données de programmes utilisateur ou système (fichier ASCII). Ces fichiers sont les résultats de programmes (éditeurs, compilateurs, fichiers résultats...).

II-C-2 - Spéciaux

L'une des originalités du système LINUX réside dans le traitement qu'il fait des entrées-sorties sur périphériques (terminaux, imprimantes, disques, bandes). D'un point de vue externe, il n'y a pas de différence pour les utilisateurs entre les fichiers ordinaires, les répertoires et les périphériques pour ce qui a trait à leur référençage. Un fichier spécial est associé à un dispositif d'entrée-sortie physique. Les fichiers spéciaux sont traités par le système comme des fichiers sur disque ordinaires, mais les opérations de lecture ou d'écriture sur ces fichiers activent les dispositifs physiques associés. A un niveau un peu plus fin on peut distinguer deux types de fichiers spéciaux :

- les fichiers spéciaux en mode caractère comme les terminaux pour lesquels les entrées-sorties sont réalisées caractère par caractère ;

- Les fichiers spéciaux en mode bloc comme les disques où les entrées-sorties sont réalisées par bloc (la taille des blocs étant en général 512 ou 1024 caractères).

II-C-3 - Répertoires

Nous avons vu leur rôle essentiel dans le système puisque c'est par leur intermédiaire que les utilisateurs peuvent désigner leurs fichiers. Citons les répertoires principaux que l'on trouve sur tous les systèmes :

- /bin : les fichiers exécutables (en binaire) (initialisation du système + commandes "essentielles") ;

- /boot : le noyau vmlinuz et les fichiers de démarrage ;

- /dev : répertoire de fichiers spéciaux, qui servent de canaux de communication avec les périphériques (disques, adaptateurs réseau, cartes son, etc.) ;

- /etc : les fichiers de configuration du système et les principaux scripts de paramétrage ;

- /home : la racine des répertoires personnels des utilisateurs ;

- /lib : les bibliothèques et les modules du noyau.

- /mnt : la racine des points de montage des systèmes de fichiers périphériques ou extérieurs (cd, disquette, nfs, etc.) ;

- /opt : lieu d'installation d'applications supplémentaires (comme emacs, java, etc.) ;

- /root : répertoire personnel du super-utilisateur root ;

- /sbin : les fichiers exécutables pour l'administration du système ;

- /tmp : stockage des fichiers temporaires ;

- /usr : programmes accessibles à tout utilisateur, sa structure reproduit celle de la racine / ;

- /var : données variables liées à la machine (fichiers d'impression, traces de connexions http, smb, etc... dans /var/log) ;

- /proc : ce pseudo-répertoire contient une "image" du système (/proc/kcore est l'image de la RAM) ;

- /lost+found : contient les pointeurs de blocs vers les blocs de données qui occupent des mauvais secteurs du disque.

II-D - Les disques logiques

L'espace physique global sur disque est divisé en disques logiques référencés dans le catalogue /dev (ce sont des fichiers spéciaux) et à chacun de ces disques logiques peut être associée une référence de catalogue. Chacun des disques logiques possède sa propre table d'index et sa propre racine de numéro 2. L'un des disques, dit disque système, est privilégié: il contient le noyau, les fichiers systèmes, etc. Au lancement du système, ces disques peuvent être montés et par conséquent devenir accessibles (donc référençables). Le disque système est naturellement toujours monté !

II-E - La protection des fichiers

Sous Linux, tout utilisateur possède, associé à son identification, un numéro de compte et appartient à un groupe particulier. Ainsi, pour un fichier donné, les utilisateurs du système peuvent-ils être classés en trois catégories :

- le propriétaire du fichier ;

- les membres d'un groupe particulier (groupe propriétaire) ;

- les autres utilisateurs.

Il existe par ailleurs dans le système un utilisateur privilégié disposant de tous les droits (le super-utilisateur dont une identification est root et le compte 0).

- la lecture ;

- l'écriture ;

- l'exécution.

Précisons que le droit d'exécution pour un utilisateur ou une catégorie d'utilisateurs, lorsqu'il est appliqué à un répertoire, signifie que cet utilisateur a la permission de faire figurer ce répertoire dans une référence ou de s'y positionner (c'est-à-dire d'en faire son répertoire de travail), le droit de lecture étant le droit de lire les noms référencés dans ce catalogue et le droit d'écriture la possibilité d'écrire dans ce répertoire, et en particulier de détruire un fichier du répertoire, et cela même sans aucun droit de lecture ou d'écriture sur ce fichier lui-même. Pour un fichier ordinaire, le droit de lecture donne la possibilité de lire le contenu du fichier et le droit d'écriture celui de modifier le fichier.

Pour assurer ces protections, le système utilise donc 9 bits du i-noeud du fichier indiquant pour chaque catégorie d'utilisateurs et chacune des opérations si l'opération est réalisable. De plus 3 autres bits ont un rôle spécial :

- le bit "set-uid" qui, lorsqu'il est positionné pour un fichier binaire exécutable, indique que le processus correspondant à une exécution de ce programme a les droits du propriétaire du programme et non de l'utilisateur qui le lance. C'est ce mécanisme qui permet à tout utilisateur de modifier le fichier /etc/passwd dont l'utilisateur privilégié root est propriétaire au travers de la commande passwd (le "set-uid bit" est positionné pour le fichier de référence /bin/passwd contenant le programme réalisant cette commande) ;

- le bit "set-gid qui a le même rôle que le précédent mais relativement au groupe ;

- le bit de "collage" (sticky bit) qui assure le maintien d'un programme en zone de swap même lorsqu'aucun processus actif ne correspond à une exécution du programme.

II-F - Comment manipuler des fichiers ?

II-F-1 - Connaître le répertoire de travail : pwd

La commande pwd fournit le nom du répertoire de travail (c'est-à-dire la référence absolue du répertoire où vous vous trouvez).

II-F-2 - Changer de répertoire de travail : cd

La commande cd permet de se déplacer dans l'arborescence du système de fichiers. Elle peut être utilisée sans paramètre, auquel cas le répertoire privé de l'utilisateur devient le répertoire de travail; ou avec un paramètre, qui doit alors désigner un répertoire (ce paramètre peut être une référence absolue ou relative de répertoire), auquel cas ce répertoire devient le répertoire de travail. Nous verrons un peu plus loin qu'il s'agit là d'une commande interne au langage de commandes (il ne lui correspond pas de fichier exécutable) contrairement à la plupart des autres commandes qui sont externes.

II-F-3 - Lister le contenu d'un répertoire : ls

La commande ls permet de connaître le contenu d'un ou plusieurs répertoires et les caractéristiques de fichiers ou répertoires donnés en arguments au moyen de diverses options. Utilisée sans argument, elle traite le répertoire de travail.

L'option -l de la commande ls permet d'obtenir des informations sur le type du fichier : répertoire, fichier ordinaire ou fichier spécial, les droits d'accès au fichier par les différents utilisateurs du système, le nombre de liens du fichier, les noms du propriétaire et du groupe, la taille des fichiers en nombre de caractères et la date de dernière modification. Elle fournit par ailleurs le nombre total de blocs physiques occupés par les fichiers énumérés.

L'option -a de la commande ls permet de lister les fichiers cachés d'un répertoire.

L'option -i de la commande ls permet de connaître les numéros d'i-noeud des répertoires et fichiers.

II-F-4 - Afficher le contenu d'un fichier ordinaire : cat

La commande cat permet d'afficher sur la sortie standard le contenu d'un ou plusieurs fichiers dont les références sont données en arguments; sans argument elle traite l'entrée standard.

La commande cat peut être appliquée à un répertoire, mais cela n'a pas beaucoup d'intérêt étant donné la nature des informations contenues dans un tel fichier (codage de nombres entiers en binaire par exemple). Son utilisation sur un répertoire, comme d'ailleurs sur un fichier binaire, ne fournit aucune information intéressante ; elle peut d'ailleurs provoquer l'émission de caractères spéciaux vers le terminal.

II-F-5 - Copier un fichier : cp

La commande cp permet d'effectuer une copie physique d'un fichier dans un autre; il y a création d'un nouvel i-noeud, création d'une nouvelle entrée dans un répertoire et recopie effective du contenu du premier fichier.

II-F-6 - Créer un lien sur un fichier : ln

Il est possible de créer des liens d'un fichier ordinaire ou spécial, c'est-à-dire de créer plusieurs références différentes à un même fichier physique au moyen de la commande ln (il s'agit de la création de synonymes d'un même objet sans création de nouvel i-noeud).

II-F-7 - Couper ou renommer un fichier : mv

Je pense que cette commande se passe de commentaire.

II-F-8 - Supprimer un fichier : rm

La suppression d'un lien d'un fichier est réalisée par la commande rm, un fichier n'étant physiquement supprimé sur le disque que lorsque le compteur de liens de son i-noeud devient nul.

II-F-9 - Créer un répertoire : mkdir

Il est cependant important de se rappeler que la création d'un répertoire ne signifie pas la création d'un répertoire vide au sens propre du terme. Cela va créer un répertoire contenant 2 références qui sont . et ..

II-F-10 - Supprimer un répertoire : rmdir

La suppression d'un catalogue vide (c'est-à-dire ne contenant que les références . et ..) est réalisée par la commande rmdir

II-F-11 - Changer les droits, le groupe et le propriétaire d'un fichier et d'un répertoire : chmod, chown, chgrp

Le propriétaire d'un fichier peut modifier le nom du propriétaire, le groupe auquel sont appliqués les droits de groupe et les droits d'accès des différentes catégories d'utilisateurs à ce fichier, et lui seul (avec le super-utilisateur) peut le faire.

III - La gestion des processus sous LINUX

Nous avons plusieurs fois dans ce qui précède fait usage du terme processus sans vraiment le définir. Dans ce chapitre, nous nous proposons de préciser cette notion et d'étudier (d'un point de vue externe, pour le moment) un certain nombre de principes qui la régissent et les commandes principales correspondantes.

III-A - Qu'est-ce qu'un processus ?

Dans tout ce qui suit, nous appellerons processus (ou tâche) toute exécution d'un programme à un instant donné, le programme constituant en lui-même un objet inerte, rangé sur disque sous la forme d'un fichier ordinaire exécutable. On peut à ce stade distinguer deux types de processus:

- les processus système qui ne sont attachés à aucun terminal, qui sont créés au lancement du système ou à des dates fixées par l'administrateur du système; les premiers ne sont interrompus qu'à l'arrêt du système (citons le swapper, un certain nombre de processus dits démons comme, par exemple, le processus assurant le bon usage de l'imprimante en spoule ou le processus cron, qui permet de lancer des tâches à une date donnée) ;

- les processus lancés par un utilisateur particulier, depuis un terminal donné ou à une date donnée. En particulier, le fait de se loguer sur un terminal, sous une identification donnée, provoque le lancement d'un processus correspondant à l'exécution d'un programme déterminé à l'avance pour chaque utilisateur (une référence du fichier contenant le programme à exécuter est donnée dans le fichier système /etc/passwd). Il s'agit presque toujours d'un processus correspondant à l'exécution d'un interpréteur de langage de commandes commme par exemple le Bash.

Le lancement d'un processus suppose par conséquent le chargement en mémoire centrale (à partir du disque) du programme correspondant en vue de son exécution. La majorité des programmes Linux sont réentrants, c'est-à-dire que si plusieurs utilisateurs demandent l'exécution d'un même programme, une seule copie du programme est placée en mémoire centrale, le système assurant pour chacun des processus correspondants à la gestion d'une zone de données propre à chacun et le bon déroulement de chacun des processus (sauvegarde de registres en particulier). L'éditeur de liens de LINUX (commande ld) fournit ou non (selon les options) des modules exécutables réentrants (zone instructions protégée en écriture).

Un processus possède un certain nombre de caractéristiques:

- une identification (un nombre entier) ;

- un propriétaire (en fait il y en a deux, qui sont des entiers) ;

- un groupe propriétaire (également deux entiers) ;

- un terminal d'attachement ;

- un certain nombre d'autres attributs (comme par exemple la priorité ou le répertoire de travail) sur lesquels nous reviendrons ultérieurement.

III-B - Lister les processus actif : ps

Tout utilisateur a la possibilité de connaître la liste des processus qui sont attachés à son terminal à un instant donné, ainsi que les caractéristiques de ces processus, au moyen de cette commande. L'exemple suivant illustre cette commande pour un utilisateur qui vient de se loguer:

Il est possible d'avoir de plus amples informations sur les processus en utilisant des options. Par exemple:

Petite définition de chaque partie du résultat:

- User: le propriétaire du processus, en général l'utilisateur qui a lancé le processus ;

- PID: le numéro d'identification unique du processus. Sont attribués dans l'ordre de lancement des processus. Quand ils atteignent 30.000 ou plus, le nombre recommence à 0. Les numéros de 0 à 5 sont généralement des processus de bas niveau du système d'exploitation qui ne peuvent être tués ;

- %CPU: pourcentage du temps de CPU consacré à l'exécution de ce processus ;

- %MEM: pourcentage de mémoire totale utilisée par ce processus ;

- VSZ: superficie totale de la mémoire virtuelle, en blocs de 1k ;

- RSS: taille réelle de l'ensemble, le chiffre exact de la mémoire physique allouée à ce processus ;

- TTY: terminal associé à ce processus. Le point d'interrogation indique que le processus n'est relié à aucun terminal ;

- STAT: code d'état du processus. Les différents états sont S - repos, R - exécution (sur file d'attente), Z - zombie, N - tâche de faible priorité ;

- START: lorsque le processus a été lancé, ceci indique en heures et minutes depuis quand le programme a été lancé, ou indique depuis combien de jours le processus est lancé si ilfonctionne depuis plus d'une journée ;

- TIME: temps CPU utilisé par le processus depuis le début du lancement ;

- COMMAND: le nom de la commande.

Il y a aussi ps -ef qui est équivalent à ps aux mais qui a l'avantage de fonctionner sur les versions POSIX qu'on trouve sur les autres systèmes Unix.

III-C - Interrompre un processus

Les processus peuvent être, en général, interrompus par l'envoi d'un signal depuis le terminal. L'émission de ce signal est provoquée par la frappe de caractères particuliers que nous désignerons par CTRL + C. Ce signal à pour effet d'interrompre tous les processus attachés au terminal depuis lequel il est émis, sauf demande expresse formulée par le processus comme nous le verrons.

Un certain nombre de processus n'acceptent pas les interruptions par ces signaux. C'est le cas, par exemple, des processus associés au Shell, dont on ne peut sortir depuis le terminal que par CTRL + D (indiquant par là la fin des données à interpréter). Nous verrons plus loin comment forcer l'interruption de processus de ce type et, par ailleurs, comment créer soi-même des tâches ayant ces propriétés.

III-D - La redirection des fichiers standards

Les processus fournissant des résultats (par exemple ls, who ou ps) les écrivent sur la sortie standard qui est, par défaut, physiquement associée au terminal de lancement du processus (un fichier spécial /dev/tty"numéro du terminal"). De façon analogique, les processus ayant besoin de données extérieures, en cours d'exécution (par exemple mail, write ou sh) les lisent sur l'entrée standard également associée par défaut à ce terminal. Il est possible d'affecter ces fichiers d'entrée et de sortie standards à d'autres dispositifs que la console qui contrôle le processus. Ce fichier peut être un autre fichier spécial ou un fichier ordinaire; la seule contrainte est que l'utilisateur ait l'autorisation d'écriture ou de lecture (suivant le cas) sur ledit fichier. La redirection de la sortie standard d'une commande dans un fichier répond à la syntaxe commande > référence. Si le fichier existe, il est préalablement supprimé.

Il est également possible d'ajouter des résultats d'un processus à la fin d'un fichier (donc sans effacement de son contenu antérieur) par des commandes de la forme commande >> référence comme l'illustre l'exemple suivant:

On constate que la redirection de la sortie standard est sans aucun effet sur le déroulement du processus. De fait, lors de l'apparition d'une erreur, le message d'erreur n'est pas envoyé sur cette sortie, mais un autre fichier standard appelé sortie d'erreur standard également associée de manière standard au terminal. Il est possible de rediriger cette sortie à peu près de la même manière que la commande précédente commande 2 > référence ou commande 2 >> référence.

On peut, de même, rediriger l'entrée standard d'un processus où sont lues les données. Cette redirection répond à la syntaxe commande < référence.

III-E - Processus parallèles et communication

Pour continuer ce premier contact avec l'univers LINUX, nous montrons quelques autres possibilités supplémentaires communes aux différents langages de commandes. Ainsi il est tout d'abord possible d'enchainer deux ou plusieurs processus de façon totalement indépendante et en séquence, le déroulement du premier n'influant pas sur celui du second qui est lancé à la fin de son exécution.

Les enchaînements de commandes que nous venons de voir ont deux caractéristiques essentielles:

- Ils sont séquentiels, c'est-à-dire qu'une commande n'est lancée (et le processus associé créé) que lorsque la précédente est terminée; il n'y a aucun parallélisme dans l'exécution. Eventuellement, comme c'est le cas des différents Shell, un processus en lance un autre et est suspendu jusqu'à la fin du processus qu'il a lancé.

- Les processus sont totalement indépendants, c'est-à-dire que le déroulement de l'un ne dépend pas de celui des précédents. Il n'y a aucun échange d'informations entre les différents processus.

III-F - Lancer un processus en arrière-plan

Les utilisateurs disposent d'un mécanisme leur permettant de lancer un certain nombre de processus de façon concurrente (en quelque sorte parallèlement) et communiquant entre eux par l'intermédiaire de tubes (pipes), le système assurant la synchronisation de l'ensemble des processus ainsi lancés. Le principe général de fonctionnement est assez simple: la sortie standard de chaque processus pipé (excepté le dernier) est redirigée sur un tube et l'entrée standard du processus suivant est redirigée sur ce tube, si bien que les données d'un processus sont constituées par les résultats du précédent dans la liste des processus donnés. Examinons sur un exemple simple ce qui se passe exactement:

La commande grep permet de rechercher une chaîne de caractères dans un fichier. La commande ps aux | grep pts/0 entraîne la création de deux processus concurrents, les résultats du premier (correspondant à la commande ps aux) étant envoyés sur un tube. C'est au niveau du tube que le second processus (correspondant à la commande grep pts/0) prend ses données, plutôt qu'au clavier. La sortie standard du processus ps aux a été redirigée sur le tube et l'entrée standard du processus grep pts/0 également. Le système assure la synchronisation de l'ensemble dans le sens où:

- Il suspend le processus lecteur dans le tube lorsque le tube est vide;

- Il suspend le processus écrivain dans le tube lorsque le tube est plein.

Sur ce dernier exemple vous avez pu voir l'existence effective des deux processus (le processus ps aux et le processus grep pts/0).

III-G - Lancer un processus en mode détaché

Une autre facilité particulièrement intéressante qui est offerte aux utilisateurs est la possibilité de lancer des processus en mode batch: ces processus sont dits en arrière-plan ou background et sont tels que le processus Shell qui les crée reprend son exécution après les avoir créés sans attendre leur achèvement. Ce mécanisme permet ainsi à un même utilisateur de lancer depuis un seul poste de travail plusieurs tâches différentes: c'est, avec le mécanisme décrit précédemment, une seconde illustration de l'aspect multitâches du système pour chaque utilisateur. Il faut cependant être conscient que ce procédé au demeurant fort agréable (en effet rien n'est plus pénible que de lancer la compilation d'un programme et de ne pouvoir utiliser son terminal durant toute cette compilation) conduit souvent à surcharger le système et par conséquent cette facilité doit être utilisée à bon escient.

Nous donnons ci-dessous un exemple de création d'un tel processus en arrière-plan correspondant au démarrage de l'éditeur de texte gedit. Le caractère & qui suit la commande indique que le processus créé doit l'être en arrière plan.

Le système répond en indiquant le numéro du processus créé. Il faut savoir qu'un tel processus a les mêmes sortie standard et sortie erreur standard que le processus qui le crée: ainsi en mode standard, les résultats éventuels sont affichés sur l'écran. Il est possible (et fort agréable) d'utiliser les redirections pour ces processus. Par ailleurs les processus ainsi détachés ne sont plus sous le contrôle direct de la console, en ce sens qu'ils ne peuvent plus lire de données au clavier du terminal. Leur entrée standard doit être redirigée, faute de quoi elle sera redirigée par défaut sur le fichier spécial de référence absolue /dev/null qui est, en quelque sorte, un puits sans fond où les utilisateurs peuvent envoyer tout ce dont ils ne veulent pas. Ces processus ne peuvent, par ailleurs, plus être interrompus par le signal correspondant à CTRL + C dont nous avons parlé un peu avant.

III-H - Interruption de processus, le retour

L'interruption des processus lancés en background (ce qui est également vrai pour ceux qui ne le sont pas) peut être réalisée de différentes manières:

- soit en se déloguant (c'est-à-dire en signalant au Shell principal du terminal la fin des données par la séquence CTRL + D) cela a pour effet d'interrompre la session de travail sur le terminal et, par voie de conséquence, tous les processus lancés depuis ce terminal (nous verrons plus tard qu'un signal particulier nommé SIGHUP est alors adressé à tous les processus attachés au terminal) ;

- Soit en lançant un processus d'interruption à destination du processus visé; nous verrons également plus tard qu'un certain nombre de signaux peuvent provoquer l'interruption d'un processus. Les signaux sont identifiés par des nombres (le signal correspondant à CTRL + C vaut 2). Signalons dès maintenant qu'il en est un qui ne peut, en aucun cas, être ignoré par les processus et constitue donc une arme absolue contre les processus indésirables: il s'agit du signal 9 (SIGKILL). Un signal peut être adressé directement à un processus au moyen de la commande kill. On lui fournit, en arguments, le numéro du signal et l'identification du processus destinataire. La commande ps est alors particulièrement utile pour retrouver le numéro d'un processus.

La commande kill -9 IDProcessus permet, en toutes circonstances à un utilisateur de tuer un processus de numéro donné depuis n'importe quel terminal; cela est particulièrement important lorsqu'on a perdu pour une raison ou une autre la main à son terminal et que le signal correspondant à la séquence CTRL + C sont sans effet; il est alors nécessaire d'envoyer ce signal d'interruption depuis une autre console. La seule contrainte à ce niveau est que l'on ne peut envoyer un signal à un processus que si l'on en est le propriétaire (à moins d'être le super-utilisateur).

Pour terminer, signalons que le fait de se déloguer avant l'achèvement des processus lancés depuis un terminal en background provoque l'interruption de ces processus (par l'émission d'un signal particulier que nous verrons plus tard). Pour éviter ce phénomène, il existe une commande nohup qui permet aux processus lancés d'ignorer le signal SIGHUP précédent. Ainsi la commande nohup prog "donnees" resultats& peut être lancée juste avant de se déloguer. Il s'agit du lancement en background du processus correspondant à l'exécution du programme de référence prog prenant ses données dans le fichier de référence "données" et écrivant ses résultats dans le fichier de référence "résultats". Le fait de se déloguer n'interrompt alors plus le processus.

IV - Remerciements

Je remercie dourouc05 et ram-0000 pour leurs conseils et leur aide. Je remercie aussi u-milite et claudeleloup pour leur correction orthographique de cet article.