Vous êtes sur la page 1sur 63

Introduction au systme UNIX

GTR 2001-02

Emmanuel Viennet
IUT de Villetaneuse Dpartement GTR viennet@lipn.univ-paris13.fr

Avant propos
Ce cours est utilis au dpartement Gnie des Tlcommunications et Rseaux (GTR) de lInstitut Universitaire de Technologie de Villetaneuse depuis 1995, avec les tudiants de premire anne et ceux suivant la Formation Continue. Il est aussi conu pour tre utilis par toute personne dsireuse de sinitier lutilisation du systme UNIX. Prrequis : an de suivre ce cours sans difcults, il est conseill dtre familier avec lutilisation de base dun systme dexploitation (DOS, Macintosh, ...) et de possder quelques notions dalgorithmique. Les trois derniers chapitres (programmation sous UNIX) demandent une bonne habitude de la programmation en langage C. Les lecteurs de ce cours sont invits participer sa mise jour : nhsitez pas envoyer vos suggestions et remarques lauteur : viennet@lipn.univ-paris13.fr.

E. Viennet - GTR - v2.0

Introduction UNIX

E. Viennet - GTR - v2.0

Licence
Copyright c 1995-2001 par Emmanuel Viennet.
Ce document peut tre librement lu, stock, reproduit, diffus, traduit et cit par tous moyens et sur tous supports aux conditions suivantes : Tout lecteur ou utilisateur de ce document reconnat avoir pris connaissance de ce quaucune garantie nest donne quant son contenu, tous points de vue, notamment vracit, prcision et adquation pour toute utilisation ; il nest procd aucune modication autre que cosmtique, changement de format de reprsentation, traduction, correction dune erreur de syntaxe vidente, ou en accord avec les clauses ci-dessous ; le nom, le logo et les coordonnes de lauteur devront tre prservs sur toutes les versions drives du document tous les endroits o ils apparaissent dans loriginal, les noms et logos dautres contributeurs ne pourront pas apparatre dans une taille suprieure celle des auteurs prcdents, des commentaires ou additions peuvent tres insrs condition dapparatre clairement comme tels ; les traductions ou fragments doivent faire clairement rfrence une copie originale complte, si possible une copie facilement accessible ; les traductions et les commentaires ou ajouts insrs doivent tre dats et leur(s) auteur(s) doi(ven)t tre identiable(s) (ventuellement au travers dun alias) ; cette licence est prserve et sapplique lensemble du document et des modications et ajouts ventuels (sauf en cas de citation courte), quelquen soit le format de reprsentation ; quel que soit le mode de stockage, reproduction ou diffusion, toute version imprime doit contenir une rfrence une version numrique librement accessible au moment de la premire diffusion de la version imprime, toute personne ayant accs une version numrise de ce document doit pouvoir en faire une copie numrise dans un format directement utilisable et si possible ditable, suivant les standards publics, et publiquement documents en usage ; La transmission de ce document un tiers se fait avec transmission de cette licence, sans modication, et en particulier sans addition de clause ou contrainte nouvelle, explicite ou implicite, lie ou non cette transmission. En particulier, en cas dinclusion dans une base de donnes ou une collection, le propritaire ou lexploitant de la base ou de la collection sinterdit tout droit de regard li ce stockage et concernant lutilisation qui pourrait tre faite du document aprs extraction de la base ou de la collection, seul ou en
E. Viennet - GTR - v2.0

Introduction UNIX

relation avec dautres documents. Toute incompatibilit des clauses ci-dessus avec des dispositions ou contraintes lgales, contractuelles ou judiciaires implique une limitation correspondante : droit de lecture, utilisation ou redistribution verbatim ou modie du document. Adapt de la licence Licence LLDD v1, octobre 1997, Libre reproduction Copyright c Bernard Lang [F1450324322014] http://pauillac.inria.fr/~lang/licence/lldd.html

E. Viennet - GTR - v2.0

Table des matires


Avant propos Licence 1 Prsentation dUNIX 1.1 Introduction . . . . . . . . . . . . 1.2 Historique et versions dUNIX . . 1.3 Architecture gnrale du systme . 1.3.1 Le noyau UNIX . . . . . . 1.3.2 Les processus . . . . . . . 1.3.3 Gestion de la mmoire . . 1.3.4 Les outils UNIX . . . . . 1.4 Les utilisateurs, laccs au systme 3 5 11 11 11 13 13 13 14 15 15 17 17 18 19 19 20 20 20 20 23 23 24 25 25 26 27

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

Les chiers UNIX 2.1 Rpertoires . . . . . . . . . . . . . . . . . . . . 2.1.1 Chemins absolus et relatifs . . . . . . . . 2.1.2 Rpertoire de connexion . . . . . . . . . 2.2 Types de chiers . . . . . . . . . . . . . . . . . 2.3 Droits daccs . . . . . . . . . . . . . . . . . . . 2.3.1 Lecture, criture et excution dun chier 2.3.2 Utilisateurs et droits . . . . . . . . . . . 2.4 Le super-utilisateur . . . . . . . . . . . . . . . . Commandes de base (shell) 3.1 Les diffrents shells . . . . . . . . . . . . 3.2 Mtacaractres du shell . . . . . . . . . . 3.3 Initialisation dun shell . . . . . . . . . . 3.4 Variables denvironnement . . . . . . . . 3.5 Commandes de manipulation des chiers 3.6 Redirections des entres/sorties . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

E. Viennet - GTR - v2.0

Introduction UNIX 3.6.1 Redirections vers/depuis des chiers . . . . . . 3.6.2 Redirections vers des tubes . . . . . . . . . . . Contrle de tches . . . . . . . . . . . . . . . . . . . . Commandes et scripts . . . . . . . . . . . . . . . . . . 3.8.1 Comment le systme excute une commande ? 3.8.2 Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 28 28 29 29 30 31 31 33 37 37 38 38 39 41 41 42 43 44 44 45 45 46 46 47 49 49 49 50 50 51 51 51 51 53

3.7 3.8

Utilitaires UNIX 4.1 Lditeur vi . . . . . . . . . . . 4.2 Commandes diverses . . . . . . 4.3 Filtres de texte . . . . . . . . . . 4.4 Manipulation des processus . . . 4.5 Gestion des systmes de chiers 4.5.1 Principes . . . . . . . . 4.5.2 Commandes de base . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

Programmation en C sous UNIX 5.1 Le compilateur C . . . . . . . . . . . . . . . . 5.2 La commande make . . . . . . . . . . . . . . . 5.3 Arguments sur la ligne de commande . . . . . 5.4 Variables denvironnement . . . . . . . . . . . 5.5 Allocation mmoire . . . . . . . . . . . . . . . 5.6 Manipulation de chiers . . . . . . . . . . . . 5.6.1 Fonctions de la librairie C . . . . . . . 5.6.2 Fichiers et descripteurs sous UNIX . . 5.6.3 Appels systmes manipulant les chiers 5.7 Lancement dune commande . . . . . . . . . . Les processus 6.1 Dnition . . . . . . . . . . . . . . . . . . 6.2 Cration de processus . . . . . . . . . . . . 6.3 Manipulation de processus en langage C . . 6.3.1 La primitive fork() . . . . . . . . . 6.3.2 Les primitives getpid() et getppid() 6.3.3 La primitive exec() . . . . . . . . . 6.3.4 La primitive exit() . . . . . . . . . 6.3.5 La primitive wait() . . . . . . . . . 6.3.6 La primitive sleep() . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

E. Viennet - GTR - v2.0

TABLE DES MATIRES 7 Communications inter-processus 7.1 Signaux asynchrones . . . . . . . . . . . . . . . . 7.1.1 Manipulation des signaux en langage C . . 7.2 Les tubes . . . . . . . . . . . . . . . . . . . . . . 7.2.1 Lancement dune commande avec popen() 7.2.2 Cration dun tube avec pipe() . . . . . . . 7.3 Synchronisation : smaphores . . . . . . . . . . . 7.4 Autres techniques de communication . . . . . . . .

9 55 55 55 57 57 58 58 59 62 63

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

Lexique Index

E. Viennet - GTR - v2.0

10

Introduction UNIX

E. Viennet - GTR - v2.0

Chapitre 1 Prsentation dUNIX


1.1 Introduction

UNIX est un systme dexploitation moderne, complet et efcace, disponible sur la plupart des ordinateurs vendus, du PC au super calculateur Cray. Cest pourtant un systme ancien, puisque son histoire remonte la n des annes 60. Son architecture ouverte et sa grande diffusion dans les centres de recherches et les universits lui ont permis dvoluer en intgrant de nombreuses amliorations. Aujourdhui, UNIX est trs utilis en informatique scientique, et pour les serveurs rseaux : la grande majorit des serveurs sur Internet fonctionnent sous UNIX. Par contre, sa relative complexit dutilisation lcarte des applications grand public. Le but de ce cours est dabord de donner un aperu gnral du fonctionnement du systme UNIX et de se familiariser avec ses commandes de bases : manipulation sous shell des chiers et processus. Nous nous sommes efforc de ne dcrire que des commandes standards, qui devraient fonctionner sous toutes les versions dUNIX et pour tous les utilisateurs. Les chapitres 5 7, plus techniques, illustrent un certain nombre de concepts importants des systmes dexploitation, laide de ltude de quelques techniques de programmation en C sous UNIX. Ces concepts (paralllisme, synchronisation, communication) sont mis en uvre de faons diffrentes par tous les systmes dexploitation modernes (par exemple Windows NT ou VMS) .

1.2

Historique et versions dUNIX

Le systme UNIX t crit en 1969 par Ken Thompson dans les laboratoires de Bell, en sinspirant du systme MULTICS. Il a trs vite t rcrit en langage C, langage dvelopp dans ce but par Dennis Ritchie.
E. Viennet - GTR - v2.0

12

Introduction UNIX

Lcriture du logiciel en langage C, et non en assembleur comme ctait alors lusage, tait une grande innovation qui permit de porter le systme sur une grande varit de machines. Bien entendu, une portion (environ 5%) du code dpend de larchitecture matrielle de lordinateur : gestion des entres/sorties, interruptions, gestion mmoire... Mais le gros du systme reste commun dune machine lautre, ce qui simplie le travail et garantit un comportement identique (portabilit). Il est ainsi inniment plus simple de porter un logiciel dune station Hewlett-Packard une Sun (toutes deux sous UNIX), que dun Macintosh (sous Mac OS) un PC (sous Windows ou MS/DOS). Depuis la n des annes 70, il existe deux grandes familles dUNIX. Dune part une version dveloppe essentiellement par luniversit de Berkeley (Californie), et nomme UNIX BSD, dautre part lUNIX Systme V commercialis par ATT. De nombreuses autres versions ont vu le jour, qui sont le plus souvent une adaptation de BSD ou Systme 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 diffrentes versions possdent quelques incompatibilits. Pour y remdier, une norme a t propose par lIEEE, le systme POSIX. La plupart des versions modernes dUNIX sont des sur-ensemble de POSIX ; un programme crit en respectant POSIX sera donc portable sur toutes ces versions. Les premires versions dUNIX ne permettaient que le travail sur des terminaux alphanumriques (il nen existait pas dautres lpoque). Un grand pas en avant a t fait avec le dveloppement au MIT du systme X Windows (X11). Ce systme permet le multifentrage sur cran graphique et le dveloppement dinterfaces utilisateurs sophistiques et conviviales (inspires du Macintosh). De nombreux environnements graphiques sont maintenant disponibles : Motif, OpenLook (Sun), KDE, Gnome, etc. Linux est une version libre dUNIX (le code source du systme est disponible gratuitement et redistribuable) qui connait actuellement un grand succs, tant chez les utilisateurs particulier (en tant qualternative Windows) que sur pour les serveurs Internet/Intranet. Linux est diffus par diffrentes socits ou organisations, sous formes de distributions qui utilisent le mme noyau (ou presque) et organisent de diverses faons le systme (packages, mises jour, etc). Les distributions les plus rpandues sont Red Hat, Suse, Caldera, Debian, Slackware et Mandrake ( lorigine issue de Red Hat) et sadressent chacune diffrents types dutilisateurs.
E. Viennet - GTR - v2.0

CHAPITRE 1. PRSENTATION DUNIX

13

1.3

Architecture gnrale du systme

UNIX est un systme dexploitation multi-tche multi-utilisateurs. Le fonctionnement multi-tche est assur par un mcanisme premptif : le systme interrompt autoritairement la tche en cours dexcution pour passer la main la suivante ; ceci vite tout risque de bloquage du systme la suite dune erreur survenant dans un programme utilisateur. La cohabitation simultane de plusieurs utilisateurs est rendue possible par un mcanisme de droits daccs sappliquant toutes les ressources gres par le systme (processus, chiers, priphriques, etc.).

1.3.1 Le noyau UNIX


Le noyau est le programme qui assure la gestion de la mmoire, le partage du processeur entre les diffrentes tches excuter et les entres/sorties de bas niveau. Il est lanc au dmarrage du systme (le boot) et sexcute jusqu son arrt. Cest un programme relativement petit, qui est charg en mmoire principale. Le rle principal du noyau est dassurer une bonne rpartition des ressources de lordinateur (mmoire, processeur(s), espace disque, imprimante(s), accs rseaux) sans intervention des utilisateurs. Il sexcute en mode superviseur, cest dire quil a accs toutes les fonctionnalits de la machine : accs toute la mmoire, et tous les disques connects, manipulations des interruptions, etc. Tous les autres programmes qui sexcutent sur la machine fonctionnent en mode utilisateur : ils leur est interdit daccder directement au matriel et dutiliser certaines instructions. Chaque programme utilisateur na ainsi accs qu une certaine partie de la mmoire principale, et il lui est impossible de lire ou crire les zones mmoires attribues aux autres programmes. Lorsque lun de ces programmes dsire accder une ressource gre par le noyau, par exemple pour effectuer une opration dentre/sortie, il excute un appel systme. Le noyau excute alors la fonction correspondante, aprs avoir vri que le programme appelant est autoris la raliser.

1.3.2

Les processus

UNIX est un systme multi-tches, ce qui signie que plusieurs programmes peuvent sexcuter en mme temps sur la mme machine. Comme on ne dispose en gnral que dun processeur, un instant donn un seul programme peut sexcuter. Le noyau va donc dcouper le temps en tranches (quelques millimes de secondes) et attribuer chaque tranche un programme. On parle de systme en temps partag. Du point de vue des programmes, tout se passe comme si lon
E. Viennet - GTR - v2.0

14

Introduction UNIX

avait une excution rellement en parallle. Lutilisateur voit sexcuter ses programmes en mme temps, mais dautant plus lentement quils sont nombreux. On appelle processus un programme en cours dexcution. A un instant donn, un processus peut tre dans lun des tats suivants : actif : le processus sexcute sur un processeur (il ny a donc quun seul processus actif en mme temps sur une machine mono-processeur) ; prt : le processus peut devenir actif ds que le processeur lui sera attribu par le systme ; bloqu : le processus a besoin dune ressource pour continuer (attente dentre/sortie par exemple). Le bloquage ne peut avoir lieu qu la suite dun appel systme. Un processus bloqu ne consomme pas de temps processeur ; il peut y en avoir beaucoup sans pnaliser les performances du systme. Remarque : le passage de ltat actif ltat prt (interruption) est dclench par le noyau lorsque la tranche de temps alloue au processus sest coule. Concrtement, le noyau programme dans ce but une interruption matrielle. Ceci implique que toute section dun programme utilisateur peut se voir interrompue nimporte o ; les processus nont bien sr pas accs aux instructions de masquage dinterruptions. Toute opration critique (ininterruptible) devra donc tre ralise dans le noyau, un processus y accdant via un appel systme.

1.3.3

Gestion de la mmoire

Le systme UNIX fonctionne en mmoire virtuelle pagine. Ceci permet de faire fonctionner des processus demandant une quantit despace mmoire suprieure la mmoire physique installe. Lorsquun processus demande lallocation dune page de mmoire et quil ny en a pas de disponible en mmoire centrale, le noyau traite un dfaut de page (voir le cours de systme). Il choisit une page (qui na pas t utilis depuis longtemps) et lcrit sur une partition spciale du disque dur. La place libre est alors attribue au processus demandeur. Ce mcanisme demande la rservation dune (ou plusieurs) partition spciale sur lun des disques durs, nomme partition de swap. La mmoire disponible pour les processus est donne par la somme de la taille de mmoire physique (RAM) et des partitions de swap. Bien entendu, les performances du systme se dgradent lorsque la frquence des dfauts de page augmente ; dans ce cas, il faut augmenter la mmoire physique. Sur un systme typique, la partition de swap est deux trois fois plus grande que la mmoire centrale (exemple : PC avec 32Mo de RAM, partition de swap de 64Mo).
E. Viennet - GTR - v2.0

CHAPITRE 1. PRSENTATION DUNIX

15

1.3.4 Les outils UNIX


UNIX est livr avec un grand nombre de programmes utilitaires. Ces programmes sont trs divers, mais surtout orients vers le traitement de chiers de textes et le dveloppement de logiciels. Tout systme UNIX inclut normalement un compilateur C (certains vendeurs tendent abandonner cet usage). Les utilitaires les plus important sont les suivants : Interprteurs de commandes (nomms shells), permettant laccs dun utilisateur au systme. Les shells sont assez sophistiqus et sapparentent de vritables langages de programmation interprts. Commandes de manipulation de chiers ; Commandes de gestion des processus ; diteurs de texte ; Outils de dveloppement : compilateurs, dbugueurs, analyseurs lexicaux et syntaxiques, etc. Nous dtaillerons certains de ces outils par la suite.

1.4 Les utilisateurs, laccs au systme


Chaque utilisateur humain du systme doit disposer dun compte protg par un mot de passe. Lorsque lon se connecte la machine, on doit fournir son nom et son mot de passe. Le nom est un pseudonyme attribu une fois pour toute un utilisateur par ladministrateur du site. Le mot de passe peut tre modi par lutilisateur aussi souvent quil le dsire. Avec la gnralisation des interfaces graphiques, laccs un systme sous UNIX sest diversi et (thoriquement) simpli. La procdure dentre dun utilisateur dans le systme se nomme le login. La sortie est donc le logout. Lors du login, lutilisateur devra toujours fournir son nom dutilisateur et un mot de passe. Aprs vrication du mot de passe, le systme lance un interprteur de commande (shell). Chaque utilisateur dispose de ses propres chiers, dont il peut autoriser ou non laccs aux autres utilisateurs. Il dispose dun certain nombre de droits (accs certains priphriques, etc). Il peut lancer lexcution de processus (le nombre maximal de processus par utilisateur peut tre limit sur certains sites). Les processus lancs par un utilisateur ont les mmes droits daccs que lui.

E. Viennet - GTR - v2.0

16

Introduction UNIX

E. Viennet - GTR - v2.0

Chapitre 2 Les chiers UNIX


Le systme de chier est gr par le noyau. Les chiers UNIX correspondent soit des chiers de donnes sur disque dur, soit des rpertoires, soit encore des chiers spciaux permettant la gestion de certaines ressources du systme (par exemple, lorsquun priphrique dentres/sorties permet des oprations comme ouverture, criture, lecture (terminal, imprimante), on y accde gnralement par un chier spcial (device)).

2.1

Rpertoires

Les chiers sont organiss en rpertoires et sous-rpertoires, formant une arborescence (gure 2.2). Dans chaque rpertoire, on trouve au moins deux chiers, nomms . (point) et .. (point point). Le premier (.) permet de rfrencer le rpertoire lui mme, et le second (..) daccder au rpertoire parent (du dessus).
Rpertoire parent

Rpertoire courant

fichier1 fichier2 ...

F IG . 2.1 Rpertoire . et ... A chaque instant, toute tche possde un rpertoire courant, ou rpertoire de travail. La commande pwd afche ce rpertoire. La commande cd permet de
E. Viennet - GTR - v2.0

18

Introduction UNIX

usr

etc

dev

users

lib include

bin

dupond

durand

compress

ls

zcat

courrier

F IG . 2.2 Exemple darborescence de chiers sous unix. La racine de larbre est le rpertoire / (en haut). Ce rpertoire contient ici 4 sous-rpertoires. changer le rpertoire courant (voir plus loin page 26).

2.1.1

Chemins absolus et relatifs

Pour dsigner un chier quelconque, on peut utiliser soit un chemin absolu, soit un chemin relatif. Un chemin absolu spcie la suite des rpertoires traverser en partant de la racine, spars par des caractres / (et non \ comme sous DOS). Par exemple, le chemin /usr/bin/compress dsigne le chier compress, qui se trouve dans le rpertoire bin, lui mme dans le rpertoire usr de la racine. Le premier caractre / indique quil sagit dun chemin absolu. Il est souvent pratique dutiliser un chemin relatif, partir du rpertoire courant. Par exemple, si lon travaille dans le rpertoire dupond de la gure 2.2, on peut accder au chier durand en spciant le chemin ../durand Du mme endroit, on peut accder au chier compress via le chemin ../../usr/bin/compress (dans ce cas prcis, il est plus simple dutiliser le chemin absolu).
E. Viennet - GTR - v2.0

CHAPITRE 2. LES FICHIERS UNIX

19

Tout chemin qui ne commence pas par un caractre / (prononc slash) est interprt comme un chemin relatif au rpertoire courant. On peut ainsi accder aux chiers du rpertoire courant en donnant simplement leur nom.

2.1.2 Rpertoire de connexion


A chaque utilisateur connu du systme est associ un rpertoire de connexion (home directory). Lutilisateur y place ses chiers personnels, et peut y crer autant de sous-rpertoires quil le dsire. Dans lexemple gure 2.2, le rpertoire de connexion de M. Dupond est /users/dupond. Aprs le login, linterprteur de commande a pour rpertoire courant le rpertoire de connexion de lutilisateur. Le rpertoire de connexion contient aussi certains chiers de conguration (voir section 3.3) permettant lutilisateur de personnaliser son environnement de travail. Ces chiers sont normalement invisibles (car leur nom commence par un point, voir la commande ls). A tout moment, on peut revenir au rpertoire de connexion grce la commande cd. On peut aussi spcier un chemin partir du rpertoire de connexion dun utilisateur en utilisant le caractre ~. Par exemple, ~dupond/courrier dsigne le chier /users/dupond/courrier

2.2

Types de chiers

Nous appelons chier tout point dans larborescence des chiers. Tous ne correspondent donc pas des chiers de donnes ordinaires. On distingue 4 types de chiers : les chiers ordinaires, qui contiennent des donnes. UNIX ne fait aucune diffrence entre les chiers de texte et les chiers binaires. Dans un chier texte, les lignes conscutives sont spares par un seul caractre \n. les rpertoires, qui contiennent une liste de rfrences dautres chiers UNIX ; les chiers spciaux, associs par exemple des pilotes de priphriques ; les tubes et sockets, utiliss pour la communication entre processus ; les liens symboliques (chiers pointant sur un autre chier).
E. Viennet - GTR - v2.0

20

Introduction UNIX

2.3

Droits daccs

A chaque chier est associ un utilisateur propritaire et un ensemble de droits daccs. Les droits daccs dnissent les possibilits de lecture, criture et excution du chier pour les utilisateurs.

2.3.1 2.3.2

Lecture, criture et excution dun chier Utilisateurs et droits

Les utilisateurs dun chier donn sont diviss en trois ensembles : le propritaire du chier ; les utilisateurs du mme groupe de travail que le propritaire ; les autres utilisateurs ayant accs au systme. Un utilisateur appartenant lun de ces ensembles accs ou non au chier en lecture (r), en criture (w) ou en excution (x). Ces droits (ou permissions) daccs ne peuvent tre changs que par le propritaire du chier, grce la commande chmod (voir page 26). La commande ls -l permet dafcher les droits daccs un chier ; par exemple : $ ls -l polyunix.tex -rwxr----1 emmanuel users 67504 Mar 25 23:29 polyunix.tex

indique que chier polyunix.tex contient 67504 caractres et appartient lutilisateur emmanuel. La date et lheure indiques sont celles de la dernire modication du contenu du chier. Les caractres en dbut de ligne (-rwxr-----) indiquent le type et les droits daccs sur ce chier. Le premier caractre donne le type, ici - dnote un chier ordinaire. Les neufs caractres restants sont diviss en trois groupes de trois, indiquant respectivement les droits du propritaire du chier, les droits des utilisateurs du mme groupe que le proprtaire, et enn les droits des autres utilisateurs. Le caractre r correspond au droit le lecture (read), w au droit dcriture (write) et x au droit dexcution. Le chier polyunix.tex montr ci-dessus est donc accessible en lecture, criture et excution par son propritaire, en lecture par les utilisateurs du mme groupe et pas du tout aux autres.

2.4

Le super-utilisateur

An de permettre ladministration du systme, un utilisateur spcial, nomm super utilisateur (ou root), est toujours considr par le systme comme propriE. Viennet - GTR - v2.0

CHAPITRE 2. LES FICHIERS UNIX

21

taire de tous les chiers (et des processus). La personne qui gre le systme est normalement la seule connatre son mot de passe. Lui seul peut ajouter de nouveaux utilisateurs au systme.

E. Viennet - GTR - v2.0

22

Introduction UNIX

E. Viennet - GTR - v2.0

Chapitre 3 Commandes de base (shell)


Un shell est un interprteur de commande en mode texte. Il peut sutiliser en mode interactif ou pour excuter des programmes crits dans le langage de programmation du shell (appels shell scripts). En mode interactif, le shell afche une invite en dbut de ligne (prompt), par exemple un caractre $, pour indiquer lutilisateur quil attend lentre dune commande. La commande est interprte et excute aprs la frappe de la touche Entre. Voici un exemple dutilisation dun shell ; les lignes dbutants par $, sont entres par lutilisateur, les autres sont afches en rponse : $ pwd /users/emmanuel/COURS/SYSTEME/POLYUNIX $ ls Makefile polyunix.dvi polyunix.tex fig polyunix.idx polyunix.toc hello.c polyunix.ind ps $ ls fig arbounix.fig tabdesc.fig tube.fig $ ls -l *.c -rw-r--r-1 emmanuel users 84 Mar 25

1996 hello.c

Chaque ligne entre par lutilisateur est interprte par le shell comme une commande, dont il lance lexcution. Le premier mot de la ligne est le nom de la commande (par exemple pwd ou ls) ; il est ventuellement suivi dun certain nombre darguments (par exemple fig ou -l).

3.1

Les diffrents shells

Il existe plusieurs shells UNIX : C-Shell (csh ou tcsh), Bourne Shell (sh ou bash), Korn shell (ksh), .... Linterprtation des commandes simples est semE. Viennet - GTR - v2.0

24

Introduction UNIX

blable pour tous ; par contre lutilisation pour crire des scripts diffre beaucoup (dnition des variables, structures de contrle, etc). Les variantes tcsh et bash apportent un plus grand confort dutilisation 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 lemploi dune syntaxe concise mais obscure et difcilement mmorisable, rendant leur apprentissage difcile (mais leur usage assez divertissant la longue !). Il est difcile dadministrer nement un systme UNIX sans possder quelques bases sur sh et csh, car de nombreux scripts de conguration sont crits dans ces langages. La tendance actuelle est de gnraliser lemploi dinterfaces graphiques, qui restent toutefois moins souples et puissantes que les scripts. Dautre part, les scripts complexes sont de plus en plus souvent crits dans des langages interprts plus puisants comme Python ou Perl. Faute de place, nous tudierons peu lcriture de shell scripts dans ce cours. Dans les sections suivantes, nous dcrivons brivement les commandes du shell les plus utilises. Les commandes sont groupes par thme. Pour retrouver rapidement une commande, utilisez lindex la n de ce document. Pour plus de dtails sur ces commandes ou sur leurs options, se reporter au manuel en ligne (commande man).

3.2

Mtacaractres du shell

Certains caractres, appels mtacaractres, sont interprts spcialement par le shell avant de lancer la commande entre par lutilisateur. Par exemple, si lon entre ls *.c, le shell remplace largument *.c par la liste des chiers du rpertoire courant dont le nom termine par .c. Les mtacaractres permettent donc de spcier facilement des ensembles de chiers, sans avoir rentrer tous leurs noms. Voici les plus utiliss : * remplac par nimporte quelle suite de caractres ; ? remplac par un seul caractre quelconque ; [ ] remplac par lun des caractres mentionns entre les crochets. On peut spcier un intervalle avec - : [a-z] spcie donc lensemble des lettres minuscules. Exemples : $ ls ABCDEF Q.R.S $ ls A* ABCDEF a aa grrr hel.l.o prog prog.c prog.o x.y.z

E. Viennet - GTR - v2.0

CHAPITRE 3. COMMANDES DE BASE (SHELL) $ ls *.c prog.c $ ls *g* grrr prog prog.c prog.o $ ls *.? Q.R.S hel.l.o prog.c prog.o $ ls [hg]* grrr hel.l.o $ ls *.[a-z].* hel.l.o x.y.z

25

x.y.z

On peut empcher linterprtation des mtacaractres par le shell en plaant largument entre apostrophes .

3.3

Initialisation dun shell

Lors de leur dmarrage, les shell excutent des chiers de conguration, qui peuvent contenir des commandes quelconques et sont gnralement utiliss pour dnir des variables denvironnement et des alias. csh excute le chier ~/.cshrc (le rc signie run command) ; tcsh excute ~/.cshrc, ou dfaut (si ce dernier nexiste pas) ~/.cshrc ; sh excute ~/.profile ; bash excute ~/.bash_profile ou dfaut ~/.profile. Rappelons que les chiers dont le nom commence par un point ne sont pas afchs par la commande ls (sauf si lon emploie loption -a) ; les chiers dinitialisation sont donc invisibles.

3.4 Variables denvironnement


Le systme unix dni pour chaque processus une liste de variables denvironnement , qui permettent de dnir certains paramtres : rpertoires dinstallation des utilitaires, type de terminal, etc. Chaque programme peut accder ces variables pour obtenir des informations sur la conguration du systme. Depuis le shell csh, les variables denvironnement sont manipules par les commandes env (afche la liste), setenv VARIABLE VALEUR (donne une valeur une variable), et echo $VARIABLE (afche la valeur de la variable).
E. Viennet - GTR - v2.0

26

Introduction UNIX

3.5

Commandes de manipulation des chiers

cat [chier1 ...] Recopie les chiers spcis lun aprs lautre sur la sortie standard (concatnation). Si aucun argument nest spci, lit sur lentre standard (jusqu rencontrer un caractre n de chier CTRL-d). La sortie standard est normalement lcran, et lentre standard le clavier (voir plus loin section 3.5), donc cat fichier afche simplement lcran le contenu du chier spci. cd [chemin] Change le rpertoire courant. Sans argument, ramne dans le rpertoire de connexion (HOME). chmod mode chier Modie les droits daccs au chier. Les droits sont spcis sous la forme : ensemble dutilisateurs +/- type de droit. Exemples : chmod a+r boite # donne le droit a tous (a) de lire (r) boite; # interdit (-) aux autres (o) et au groupe (g) decrire (w); # donne le droit dexecution (x) au proprietaire (u) du fichier boite.

chmod og-w boite chmod u+x boite

cp [-ipr] source... dest Si dest est un rpertoire, copie le ou les chier(s) source vers dest. Si dest est un nom de chier, renomme source. Principales options : -i demander conrmation en cas dcrasement de la destination ; -p prserve les dates daccs et de modication ; -r copie rcursive (descend les sous-rpertoires, voir aussi la commande tar page 35). echo [-n] message Afche les arguments, tels quil sont valus par le shell. Loption -n supprime le saut de ligne.
E. Viennet - GTR - v2.0

CHAPITRE 3. COMMANDES DE BASE (SHELL) ls [-aldF] chemin1 chemin2 ... cheminn

27

chemini est un nom de chier ou de rpertoire. Si cest un chier, afche sa descrition ; si cest un rpertoire, afche la description de son contenu. Options : -a liste tous les chiers (y compris les .* normalement cachs). -l format long (taille, date, droits, etc). -d dcrit le rpertoire et non son contenu. -F format court avec indication du type de chier (ajoute * si excutable, / si rpertoire). -i afche les numros dinode des chiers. mkdir [chemin] Cre un rpertoire. Le chemin peut tre relatif (par exemple mkdir ../exam) ou absolu (par ex. mkdir /users/emmanuel/cours). mv [-i] source dest Si dest est un rpertoire, dplace le chier source vers dest. Si dest est un nom de chier, renomme source. Loption -i permet de demander conrmation en cas dcrasement de la destination. pwd Afche le rpertoire courant. rm [-ri] chier ... Supprime le ou les chiers spcis. Loption -i permet de demander conrmation pour chacun. Loption -r agit de faon rcursive, cest dire dtruit aussi les rpertoires (pleins ou vide) et leurs sous-rpertoires.

3.6

Redirections des entres/sorties

Chaque programme sous UNIX dispose au moins de deux ux de donnes : lentre standard, utilise en lecture, qui est normalement associe au clavier du terminal, et la sortie standard, utilise en criture, normalement associe lcran du terminal (ou la fentre de lancement le cas chant). Tous les ux de donnes sont manipuls comme de simples chiers : on utilisera par exemple la mme commande pour lire un caractre au clavier, dans un chier sur disque ou via une liaison rseau. Ceci simplie grandement lcriture des programmes et amliore leur rusabilit.
E. Viennet - GTR - v2.0

28

Introduction UNIX

3.6.1

Redirections vers/depuis des chiers

Il est trs simple de rediriger lentre ou la sortie standard dun programme lors de son lancement depuis un shell UNIX. Pour la sortie, on utilisera la construction suivante : ls > resultat Dans ce cas, au lieu dafcher sur lcran, la commande ls va crer un chier nomm ici resultat et y crire. Rien napparait lcran (sauf sil se produit une erreur). Si lon dsire ne pas effacer lancien contenu du chier, mais crire sa n, on peut utiliser >> : ls >> resultats Enn, pour rediger lentre standard, on utilise < : cat < UnFichier Il est possible de rediriger lentre et la sortie en mme temps : cat < UnFichier > Resultat Notons enn quil existe un troisime ux standard, utilis pour lcriture des messages derreur (nomm stderr en C, ou cerr en C++). Il se redirige avec >&.

3.6.2

Redirections vers des tubes

De faon similaire, il est possible de rediriger la sortie standard dune commande vers lentre standard dune autre commande grce au tube (pipe) not |. Les diffrentes commandes sexcutent alors en parallle. # affiche le contenu du repertoire trie a lenvers ls | sort -r

3.7

Contrle de tches

Normalement, le shell attend la n de lexcution dune commande avant dafcher le prompt suivant. Il arrive que lon dsire lancer une commande de longue dure tout en continuant travailler dans le shell. Pour cela, il suft de terminer la ligne de commande par le caractre & (et commercial).
E. Viennet - GTR - v2.0

CHAPITRE 3. COMMANDES DE BASE (SHELL) Par exemple : $ calcul & $ ls -Ral / > ls-Ral.txt & $

29

Ici, les deux commandes sexcutent en parallle, tandis que le shell attend notre prochaine instruction1 . On dit que les processus sexcutent en tches de fond. Pour connatre la liste des tches de fond lances de ce shell, utiliser la commande jobs : $ jobs [1] Running [2] Running $ calcul ls -Ral / > ls-Ral.txt

Le nombre entre crochets est le numro de la tche de fond (job). On peut envoyer un signal une tche en utilisant kill et % la place du PID : $ kill [-signal] %numero_de_tache

Pour remettre une tche de fond au premier plan, utiliser la commande fg (utile si la tche ralise une entre clavier par exemple). Enn, la commande sleep n suspend lexcution durant n secondes (le processus shell passe ltat bloqu durant ce temps).

3.8

Commandes et scripts

3.8.1 Comment le systme excute une commande ?


Lorsque lon entre une ligne de commande sous un shell, ce dernier demande au systme dexcuter la commande, aprs avoir ventuellement substitu les mta-caractres (*, ? etc.) et remplacs les alias. A chaque commande doit alors correspondre un chier excutable (avec le droit x). Ce chier excutable porte le nom de la commande et est recherch par le systme dans une liste de rpertoires (spcie par la variable denvironnement PATH). La commande which permet de savoir quel est le chier correspondant une commande.
1

Question : que fait la deuxime commande lance ?

E. Viennet - GTR - v2.0

30 which commande

Introduction UNIX

Afche le chemin du chier excutable correspondant la commande. Exemple : $ which csh /bin/csh Le chier excutable est soit un chier binaire (du code en langage machine), qui est alors excut directement par le processeur, soit un chier texte contenant un script.

3.8.2

Scripts

Les scripts sont des programmes crits dans un langage interprt, par exemple le langage du shell. Un script peut tre une simple liste de commandes. La premire ligne du script doit prciser linterprteur utilis, elle commence par les deux caractres #!, suivis du chemin de linterprteur. Voici un exemple simple : #!/bin/csh echo Contenu du repertoire courant ls -l echo ---------------------------Ce script afche la liste dtaille des chiers du rpertoire courant. Il doit tre entr laide dun diteur de texte, enregistr dans un chier (nomm par exemple liste), puis rendu excutable grce la commande chmod (voir page 26) : $ chmod a+x liste Exemple dutilisation du script : $ liste Contenu du repertoire courant -rw-r--r-1 em users 1466 Mar 19 1996 arbounix.fig -rw-r--r-1 em users 4066 Feb 17 12:28 filesystem.fig -rw-r--r-1 em users 659 Feb 17 13:16 pointpoint.fig -rw-r--r-1 em users 583 Mar 19 1996 tabdesc.fig -rw-r--r-1 em users 1062 Mar 19 1996 tube.fig ---------------------------On peut crire des scripts sophistiqus (avec arguments, tests, boucles etc.), mais nous ntudierons pas ces techniques dans ce cours.

E. Viennet - GTR - v2.0

Chapitre 4 Utilitaires UNIX


Cette partie dcrit quelques commandes utilitaires UNIX trs pratiques. Ces programmes sont livrs en standard avec toutes les versions dUNIX. Nous commenons par dcrire lutilisation de lditeur standard vi. Si vous avez accs un autre diteur de texte, vous pouvez passez cette section.

4.1

Lditeur vi

vi est un diteur de texte plein cran (par opposition aux diteurs ligne qui ne permettaient que ldition dune ligne la fois). Compar aux diteurs modernes, vi est dabord malcommode, mais il est assez puissant et toujours prsent sur les systmes UNIX1 . Il est donc trs utile den connatre le maniement de base. Nous ne dcrivons ici que les commandes et modes les plus utiliss, il en existe beaucoup dautres. A un instant donn, vi est soit en mode commande, soit en mode insertion : mode commande : les caractres taps sont interprts comme des commandes ddition. vi dmarre dans ce mode, il faut donc lui indiquer (commande i) que lon veut insrer du texte ; mode insertion : les caractres sont insrs dans le texte dit. On peut quitter ce mode en pressant la touche ESC (ou Echap sur certains claviers). Appel de vi
1

depuis le shell :

Notons quil existe sous UNIX des diteurs pour tous les gots, depuis Emacs pour les dveloppeurs jusqu TextEdit et autres pour les utilisateurs allergiques au clavier (mais pas la souris).
E. Viennet - GTR - v2.0

32 vi chier dite chier. vi +n chier commence la ligne n. vi -r chier rcupration du chier aprs un crash.

Introduction UNIX

Mouvements du curseur (en mode commande seulement) : Touche Action ches Dplace curseur (pas toujours bien congur). ESPACE Avance droite. h Recule gauche. CTRL-n Descend dune ligne. CTRL-p Monte dune ligne. CTRL-b Monte dune page. CTRL-f Descend dune page. nG Va la ligne n (n est un nombre). Commandes passant en mode insertion : Touche Commence linsertion i Avant le curseur. I Au dbut de la ligne. A A la n de la ligne. Autres commandes : r Remplace le caractre sous le curseur. x Supprime un caractre. d$ Efface jusqu la n de la ligne. dd Efface la ligne courante. /chane Cherche la prochaine occurrence de la chane. ?chane Cherche la prcdente occurrence de la chane. Quitter, sauvegarder : (terminer la commande par la touche Entre) :w crit le chier. :x crit le chier puis quitte vi. :q ! Quitte vi sans sauvegarder les changements. ! !commande Excute commande shell sans quitter lditeur.

E. Viennet - GTR - v2.0

CHAPITRE 4. UTILITAIRES UNIX

33

4.2

Commandes diverses
Compresse le chier (pour gagner de lespace disque ou acclrer une transmission rseau). Le chier est remplac par sa version compresse, avec lextension .Z. Dcompression avec uncompress ou zcat.

compress [chier]

date Afche la date et lheure. Comporte de nombreuses options pour indiquer le format dafchage. diff chier1 chier2 Compare ligne ligne des deux chiers texte chier1 et chier2, et dcrit les transformations appliquer pour passer du premier au second. Diverses options modient le traitement des blancs, majuscules etc. diff peut aussi gnrer un script pour lditeur ed permettant de passer de chier1 chier2 (utile pour fabriquer des programmes de mise jour (patchs)). le chier Essaie de dterminer le type du chier (excutable, texte, image, son,...) et lafche. nd [options] Cette commande permet de retrouver dans un rpertoire ou une hirarchie de rpertoires les chiers possdant certaines caractristiques (nom, droits, date etc..) ou satisfaisant une expression boolenne donne. nd parcourt rcursivement une hirarchie de chiers. Pour chaque chier rencontr, nd teste successivement les prdicats spcis par la liste doptions, jusquau premier qui choue ou jusqu la n de la liste. Principales options : -name nom le chier ce nom ; -print crit le nom du chier (russit toujours) ; -exec excute une commande. {} est le chier courant. Terminer par ; . -type (d : catalogue, f : chier ordinaire, p : pipe, l : lien symbolique). -newer chier compare les dates de modication ; -o ou ;
E. Viennet - GTR - v2.0

34

Introduction UNIX -prune si le chier courant est un catalogue, lague larbre ce point. Exemples : # Recherche tous les fichier nommes "essai" # a partir de la racine find / -name essai -print # Recherche tous les fichier commencant par "ess" # a partir du repertoire courant find . -name ess* -print # Affiche a lecran le contenu de tous les fichiers .c find . -name *.c -print -exec cat {} \; (lcriture de ce dernier exemple est complique par le fait que le shell traite spcialement les caractres *, {, et ;, que lon doit donc entourer de quotes .)

head [-n] [chier] Afche les n premires lignes du chier. Si aucun chier nest spci, lit sur lentre standard. lpr [-Pnom-imprimante] [chier] Demande limpression du chier (le place dans une le dattente). Si aucun chier nest spci, lit sur lentre standard. Limpression dun chier sous Unix passe par un spooler dimpression. Ce spooler est ralis par un dmon (cest dire un processus systme qui sexcute en tche de fond). lpq [-Pnom-imprimante] Permet de connatre ltat de la le dattente associe limprimante. lprm [-Pnom-imprimante] numjob Retire un chier en attente dimpression. On doit spcier le numro du job, obtenu grce la commande lpq. man [n] commande Afche la page de manuel (aide en ligne) pour la commande. Largument n permet de spcier le numro de la section de manuel (utile lorsque la commande existe dans plusieurs sections). Les numros des sections sont : 1 (commandes utilisateur), 2 (appels systmes), 3 (fonctions librairies C), 4
E. Viennet - GTR - v2.0

CHAPITRE 4. UTILITAIRES UNIX

35

(devices), 5 (formats de chiers), 6 (jeux), 7 (divers), 8 (administration) et n (new, programmes locaux). Voir aussi le lexique page 62. more [chier] Afche un chier page par page (aide en ligne, taper h). Si aucun chier nest spci, lit sur lentre standard. tail [+n | -n] [chier] La forme tail +n permet dafcher un chier partir de la ligne n. La forme tail -n afche les n dernires lignes du chier. Si aucun chier nest spci, lit sur lentre standard. tar options [chier ou rpertoire] La commande tar permet darchiver des chiers ou une arborescence de chiers, cest dire de les regrouper dans un seul chier, ce qui est trs pratique pour faire des copies de sauvegardes dun disque, envoyer plusieurs chiers en une seul fois par courrier lectronique, etc. Pour crer une nouvelle archive, utiliser la forme $ tar cvf nom-archive repertoire qui place dans le nouveau chier nom-archive tous les chiers situs sous le rpertoire indiqu. On donne gnralement lextension .tar aux chiers darchives. Pour afcher le contenu dune archive, utiliser $ tar tvf nom-archive Pour extraire les chiers archivs, utiliser $ tar xvf nom-archive les chiers sont cres partir du rpertoires courant. Nombreuses autres options. Notons que les noms de chiers peuvent tre remplacs par - pour utiliser lentre ou la sortie standard (ltres), comme dans les exemples ci-dessous : Archivage dun rpertoire et de ses sous-rpertoires dans un chier archive.tar : $ tar cvf archive.tar repertoire Archivage et compression au vol : $ tar cvf - repertoire | compress > archive.tar.Z Pour afcher lindex de larchive ci-dessus : $ zcat archive.tar.Z | tar tvf E. Viennet - GTR - v2.0

36

Introduction UNIX Copie complte rcursive dun rpertoire repert dans le rpertoire destination : $ tar cvf - repert | (cd destination; tar xvfp -) Les parenthses sont importantes : la deuxime commande tar sexcute ainsi dans le rpertoire de destination. Cette faon de procder est suprieure cp -r car on prserve les propritaires, droits, et dates de modications des chiers (trs utile pour effectuer des sauvegardes).

uncompress [chier] Dcompresse un chier (dont le nom doit terminer par .Z) compress par compress. wc [-cwl] [chier ...] Afche le nombre de caractres, mots et lignes dans le(s) chier(s). Avec loption -c, on obtient le nombre de caractres, avec -w, le nombre de mots (words) et avec -l le nombre de lignes. which commande Indique le chemin daccs du chier lanc par commande. who [am i] Liste les utilisateurs connects au systme. La forme who am i donne lidentit de lutilisateur. zcat [chiers] Similaire cat, mais dcompresse au passage les chiers (ou lentre standard) compresss par compress. uuencode [chier] nom Utilis pour coder un chier en nutilisant que des caractres ascii 7 bits (codes entre 0 et 127), par exemple pour le transmettre sur un rseau ne transmettant que les 7 bits de poids faible. uudencode lit le chier (ou lentre standard si lon ne prcise pas de nom) et crit la version code sur la sortie standard. Le paramtre nom prcise le nom du chier pour le dcodage par uudecode. uudecode [chier] Dcode un chier cod par uuencode. Si largument fichier nest pas spci, lit lentre standard. Le nom du chier rsultat est prcis dans le codage (paramtre nom de uuencode).
E. Viennet - GTR - v2.0

CHAPITRE 4. UTILITAIRES UNIX

37

4.3

Filtres de texte

Les ltres sont des utilitaires qui prennent leurs entres sur lentre standard, effectuent un certain traitement, et fournissent le rsultat sur leur sortie standard. Notons que plusieurs utilitaires dja prsents peuvent tre vus comme des ltres (head, tail). grep [option] motif chier1 ... chiern Afche chaque ligne des chiers chieri contenant le motif motif. Le motif est une expression rgulire. Options : -v afche les lignes qui ne contiennent pas le motif. -c seulement le nombre de lignes. -n indique les numros des lignes trouves. -i ne distingue pas majuscules et minuscules. sort [-rn] [chier] Trie les lignes du chier, ou lentre standard, et crit le rsultat sur la sortie. Loption -r renverse lordre du tri, loption -n fait un tri numrique. tr [options] chaine1 chaine2 Recopie lentre standard sur la sortie standard en remplaant tout caractre de chaine1 par le caractre de position correspondante dans chaine2. uniq [-cud] chier Examine les donnes dentre ligne par ligne et dtermine les lignes dupliques qui sont conscutives : -d permet de retenir que les lignes dupliques. -u permet de retenir que les lignes non dupliques. -c permet de compter lindice de rptition des lignes.

4.4

Manipulation des processus

kill -sig PID Envoie le signal sig au processus de numro PID. Voir la table 7.1 (page 56) pour une liste des signaux. sig peut tre soit le numro du signal, soit son nom (par exemple kill -STOP 1023 est lquivalent de kill -19 1023). ps [-e][-l] Afche la liste des processus. Loption -l permet dobtenir plus dinformations. Loption -e permet dafcher les processus de tous les utilisateurs.
E. Viennet - GTR - v2.0

38

Introduction UNIX ps afche beaucoup dinformations. Les plus importante au dbut sont : UID : identit du propritaire du processus ; PID : numro du processus ; PPID : PID du pre du processus ; NI : priorit (nice) ; S : tat du processus (R si actif, S si bloqu, Z si termin).

nice [-priorite] commande Lance lexcution de la commande en modiant sa priorit. Permet par exemple de lancer un processus de calcul en tche de fond sans perturber les processus interactifs (diteurs, shells etc.), en lui affectant une priorit plus basse. Le noyau accorde moins souvent le processeur aux processus de basse priorit.

4.5
4.5.1

Gestion des systmes de chiers


Principes

Tous les disques, disquettes et CD-ROMs connects un ordinateur sous UNIX sont accds via une arborescence unique, partant du rpertoire racine /. La complexit du systme est ainsi masque lutilisateur, qui peut utiliser les mmes commandes pour accder un chier sur disque dur ou sur CD-ROM. Remarquez que ce principe est diffrent de celui employ par les systmes MS-DOS et Windows, pour lesquels chaque volume (disque) possde une racine spcique repre par une lettre (A:\, C:\, etc). Bien entendu, les chiers sont organiss de faon diffrentes sur les disques durs, les disquettes, ou les CD-ROMS : chaque priphrique possde son propre systme de chiers. Les diffrents systmes de chier, que lon peut considrer comme des sousarborescences associes un priphrique spcial, sont montes sur larborescence racine. Chaque systme de chier doit possder un point de montage, qui est au dpart (avant montage) un simple rpertoire vide (voir gure 4.1). La commande mount permet dassocier au point de montage le systme de chier correspondant. Il faut lui prciser le pilote de priphrique (device driver) utilis pour accder ce systme. Nous ntudions pas dans ce cours la gestion des pilotes de priphriques sous UNIX ; notons simplement que chaque pilote correspond un pseudo-chier dans le rpertoire systme /dev.
E. Viennet - GTR - v2.0

CHAPITRE 4. UTILITAIRES UNIX


/ RACINE usr etc users cdrom

39

CD-ROM lib include bin etudiants Profs

compress

ls

zcat

IUT

DEUG

PROFS

Marcel Raymond ETUDIANTS

F IG . 4.1 Dans cet exemple, larborescence des chiers est compose de quatre systmes de chiers : le systme racine (point de montage /, deux systmes pour les utilisateurs (/users/etudiants et /users/profs), et un systme pour le CD-ROM (/cdrom).

4.5.2 Commandes de base


Nous dcrivons simplement trois commandes permettant dobserver ltat des systmes de chiers. Nous de dcrivons pas leur utilisation pour administrer le systme (ajouter un systme de chier, etc). mount [point dentree] Permet dafcher la liste des sytmes de chiers en service (monts). Le format dafchage dpend lgrement de la version dUNIX utilise. Un exemple simple sous Linux : $ mount /dev/sda3 on / type ext2 (rw) /dev/sda4 on /users type ext2 (rw) /dev/sdb1 on /jaz type ext2 (rw) On a ici trois systmes de chiers, grs par les pilotes /dev/sda3, /dev/sda4 et /dev/sdb1 (trois disques durs SCSI), et monts respectivement sur la racine, /users et /jaz. La commande mount est aussi utilise pour monter un nouveau systme de chiers dans larborescence (lors du dmarrage du systme ou de lajout dun disque).
E. Viennet - GTR - v2.0

40 df [chemin]

Introduction UNIX

df (describe lesystem) afche la capacit totale dun systme de chiers (gnralement en KiloOctets), le volume utilis et le volume restant disponible. Le format dafchage dpend aussi de la version utilise. Exemple sous Linux : $ df /users Filesystem 1024-blocks Used Available Capacity Mounted on /dev/sda4 417323 347789 47979 88% /users On a ici 417323 Ko au total, dont 347789 sont utiliss et 47979 libres. du [-s] [chemin] du (disk usage) afche la taille occupe par le chier ou rpertoire spci par largument chemin. Avec loption -s, nafche pas le dtail des sousrpertoires. Exemple : $ du POLYUNIX 10 POLYUNIX/fig 19 POLYUNIX/ps 440 POLYUNIX $ du -s POLYUNIX 440 POLYUNIX Le rpertoire POLYUNIX occupe ici 440 Ko.

E. Viennet - GTR - v2.0

Chapitre 5 Programmation en C sous UNIX


Nous dcrivons dans cette section les bases de la programmation en langage C sous UNIX.

5.1

Le compilateur C

Par convention, les chiers contenant du source C possdent lextension .c, les chiers headers lextension .h et les chiers objets .o. Il ny a pas de convention spciale pour les excutables qui doivent par contre possder le droit dexcution x. Soit le chier hello.c contenant le texte source suivant : /* Exemple simple */ #include <stdio.h> main() { printf("Hello, world !\n"); } Le compilateur C peut sappeler depuis une ligne de commande shell sous la forme : $ cc hello.c ($ dsigne le prompt du shell). Le programme hello.c est alors compil et un chier excutable nomm a.out est cr. On peut lancer son excution en tapant : $ a.out Hello, world ! Il est possible de spcier le nom de lexcutable produit grce loption -o : $ cc hello.c -o hello
E. Viennet - GTR - v2.0

42

Introduction UNIX

La commande cc admet de nombreuses options sur la ligne de commande. Une option trs utile est -I qui spcie une rpertoire o rechercher les chiers inclus par la directive #include. Par exemple, si lon a plac nos chiers .h dans sous-rpertoire inc, on pourra utiliser : $ cc -Iinc exo.c -o exo Sur certains systmes, dautres options sont ncessaire pour spcier la variante de langage C utilise (K&R ou ANSI) et lutilisation ou non de la norme POSIX.

5.2

La commande make

Lorsque lon dveloppe un programme un peu plus important que lexemple donn plus haut, il devient vite fastidieux dutiliser directement la commande cc, avec les bonnes options et sans oublier de recompiler tous les chiers que lon a modis depuis la dernire mise jour. Supposons que lon travaille sur un projet comportant deux chiers sources, main.c et func.c, qui utilisent tous deux un chier inc/incl.h plac dans un sous-rpertoire. Lexcutable que lon fabrique est nomm essai. En utilisant cc, il faut faire : $ cc -c -Iinc -o main.o main.c $ cc -c -Iinc -o func.o func.c $ cc -o essai main.o func.o Loption -c spcie que lon veut fabriquer un chier objet (.o) qui sera li ultrieurement pour obtenir un excutable. Si lon modie main.c, il faut refaire les tapes 1 et 3. Si lon modie le chier inclut, il faut tout refaire. On dit que essai dpend de main.o et func.o, qui dpendent eux mme de main.c, func.c et de incl.h. Ceci signie que notre excutable nal (essai) est jour si sa date de modication est plus grande que celle de main.o et func.o, et ainsi de suite. La commande make permet dautomatiser ce genre de chanes de production. Son utilisation permet au dveloppeur de sassurer quun module donn est toujours jour par rapport aux divers lments dont il dpend. make se charge de dclencher les actions ncessaires pour reconstruire le module cible. make [-f chier-dep] make utilise un chier spcial (appel makele) indiquant les dpendances entre les divers chiers maintenir. Ce chier est nomm par dfaut Makefile.
E. Viennet - GTR - v2.0

CHAPITRE 5. PROGRAMMATION EN C SOUS UNIX Syntaxe dun chier makele : but : dependance1 [...[dependance_n]] commande1 commande2 ...

43

La ou les cibles doivent apparatre sur la premire ligne et tre suivies de :. A la suite gure la liste des dpendances conduisant la cible. Les rgles de production sont dcrites sur les lignes suivantes, qui doivent imprativement commencer caractre de tabulation. Voici un exemple de chier Makele traitant lexemple prcdent : all: essai essai: main.o func.o cc -o essai func.o main.o CFLAGS= -Iinc func.o: inc/incl.h main.o: inc/incl.h La premire ligne (all) indique que la cible par dfaut est essai : lorsque lon actionne make sans arguments, on veut fabriquer essai. Ensuite, on indique que essai dpend des deux chiers objets, et quil se fabrique partir deux en actionnant cc -o essai .... CFLAGS est une variable spciale indiquant les options passer au compilateur C, ici -Iinc. Enn, on spcie que les chiers .o dpendent du chier .h. Notons que make utilise un certain nombre de rgles par dfaut, par exemple celle disant que les chiers .o dpendent des chiers .c et se fabriquent en utilisant cc. Il nest donc pas ncessaire de faire gurer la rgle complte, qui scrirait : main.o: inc/incl.h main.c cc -Iinc -c -o main.o main.c

5.3 Arguments sur la ligne de commande


Lexcution dun programme nomm exemple est lanc depuis un shell par : $ exemple Si lon entre
E. Viennet - GTR - v2.0

44 $ exemple un deux trois

Introduction UNIX

le programme est lanc de la mme faon, et il reoit les chanes de caractres "un", "deux" et "trois" comme arguments. En langage C, ces arguments peuvent facilement tre rcuprs par la fonction main() du programme (qui, rappelons le, est la premire fonction appele lors du lancement de ce programme). Il suft de dclarer la fonction main() comme ceci : void main( int argc, char *argv[] ) la variable argc reoit le nombre de paramtres sur la ligne de commande. argv est un tableau de chanes de caractres contenant les paramtres. Exemple : soit un excutable nomm essai, si lon entre $ essai il fait beau On aura : argc = 4 argv[0] = argv[1] = argv[2] = argv[3] = "essai" "il" "fait" "beau"

Notons que argv[0] contient toujours le nom du programme lanc.

5.4

Variables denvironnement

En langage C, on peut accder la liste de ces variables par lintermdiaire du troisime argument de la fonction main(), qui est alors dclare comme : void main( int argc, char *argv[], char *arge[] ) arge est un tableau de chanes de caractres dnissant les variables denvironnement, sous la forme NOM=VALEUR. On peut aussi utiliser les fonctions getenv() et setenv(). Attention, chaque processus hrite dune copie des variables denvironnement de son pre. Les modications quil peut apporter ces variables naffecteront donc que ses descendants (les processus quil lancera), jamais le processus pre.

5.5

Allocation mmoire

Pour allouer des blocs de mmoire dynamique sous UNIX, il est conseill dutiliser les fonctions de la librairie C standard : malloc() et free() en C, new et delete en C++.
E. Viennet - GTR - v2.0

CHAPITRE 5. PROGRAMMATION EN C SOUS UNIX #include <stdlib.h> void *malloc( int nb_octets ); void *calloc( int nb_elem, int taille_elem ); void free( void *ptr );

45

La fonction malloc() alloue un bloc de mmoire contige de nb_octets octets. La fonction calloc() alloue un bloc de nb_elem x taille_elem octets et linitialise zro. Les blocs allous sont librs aprs usage par la fonction free().

5.6

Manipulation de chiers

5.6.1 Fonctions de la librairie C


La librairie C standard permet de manipuler des chiers (ouverture, lecture, criture) via des pointeurs sur des ux de type FILE. Ces fonctions sont dnies dans le chier include <stdio.h>. Voici les principales fonctions utilises (cf le cours de C) : #include <stdio.h> FILE *fopen( char *chemin, char *mode ); int fclose( FILE * ); int fprintf( FILE *, char *format, ... ); int fwrite( void *ptr, int size, int nbelem, FILE * ); int fread( void *ptr, int size, int nbelem, FILE * ); int fflush( FILE * ); int feof( FILE * ); Notez que ces fonctions existent aussi bien en C sous DOS que sous Macintosh ou UNIX. Elles doivent tre utilises si lon dsire crire un programme portable. Dans ce cas, il est vident que lon sinterdit lusage de toutes les fonctionnalits propres chaque systme dexploitation. Note : les oprations dentres/sorties effectues par les fonctions ci-dessus sont bufferises ; ainsi, lappel fwrite() ou fprintf() copie simplement les donnes dans un tampon (ou buffer), qui est vid une fois plein vers le chier concern. Ceci permet dviter de multiplier inutilement les oprations dentres/sorties, souvent coteuses. Une consquence troublante pour le dbutant est que lors de lenvoi de caractres vers lcran, ceux ci napparaissent pas immdiatement, sauf si lon force la vidange du tampon avec un retour chariot ou lappel explicite fflush().
E. Viennet - GTR - v2.0

46

Introduction UNIX

0 1 2 3

entre standard sortie standard sortie derreur fichier TOTO

F IG . 5.1 Table des descripteurs dun processus aprs ouverture dun chier TOTO. La prochain chier ouvert se verrait attribuer le descripteur numro 4.

5.6.2

Fichiers et descripteurs sous UNIX

Pour manipuler plus nement les chiers UNIX, il est souvent ncessaire dutiliser directement des appels systme de plus bas niveau que ceux de la librairie C. Le noyau UNIX maintient une table des chiers ouverts par un processus. Le terme chier dsigne ici un ux de donnes unidirectionnel qui nest pas ncessairement associ un chier disque. Chaque processus dispose toujours son lancement de trois ux de donnes : 1. lentre standard, associe normalement au clavier du terminal de lancement ; 2. la sortie standard, associe normalement lcran du terminal (ou la fentre de lancement) ; 3. la sortie derreur, qui concide par dfaut avec la sortie standard. Nous avons vu dans la section 3.5 comment rediriger ces ux standard depuis le shell. Un programme accde aux ux de donnes ouverts en spciant des descripteurs, qui sont simplement des nombre entiers correspondant lindice du ux dans la table. La table est remplie dans lordre douverture des chiers, en commenant 3 puisque les trois premiers descripteurs sont toujours occups par les ux standards (voir gure 5.1).

5.6.3

Appels systmes manipulant les chiers

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>


E. Viennet - GTR - v2.0

CHAPITRE 5. PROGRAMMATION EN C SOUS UNIX

47

int int int int

open( char *chemin, int mode, ... ); close( int desc ); read( int desc, void *ptr, int nb_octets ); write( int desc, void *ptr, int nb_octets );

La fonction open() ouvre un chier en lecture ou en criture, cre un nouveau descripteur et le retourne. close() ferme un descripteur. read() et write() permettent de lire ou dcrire une zone mmoire sur un descripteur.

5.7

Lancement dune commande

Pour lancer lexcution dune commande externe depuis un programme C, on peut utiliser lappel int system ( char *comm ); Le processus qui appelle system() est bloqu jusqu la n de la commande lance.

E. Viennet - GTR - v2.0

48

Introduction UNIX

E. Viennet - GTR - v2.0

Chapitre 6 Les processus


Nous tudions dans cette section comment sont crs des processus UNIX, et quels sont les appels systme utiliser en langage C.

6.1

Dnition

Un programme qui sexcute est appel un processus (voir section 1.3.2, page 13). Un processus comporte du code machine excutable, une zone mmoire (donnes alloues par le processus) et une pile (pour les variables locales des fonctions et la gestion des sous-programmes). Lors de la cration dun processus, le noyau lui attribue un numro unique, nomm PID (processus identier). Ce numro permet de reprer le processus. La commande ps (voir page 37) afche la liste des processus. Chaque processus a un utilisateur propritaire, qui est utilis par le systme pour dterminer ses permissions daccs aux chiers.

6.2

Cration de processus

Lorsquon entre une commande dans un shell, le shell lance un processus pour lexcuter1 . Le shell attend ensuite la n de ce processus, puis demande la commande suivante. Chaque processus a ainsi un processus pre, qui est celui qui la lanc. Le numro du processus pre est not PPID (parent PID). Un processus na bien sr quun seul pre, mais peut lancer lexcution de plusieurs autres processus, nomms processus ls. On a donc affaire une arborescence de processus. Lors
Sauf pour les commandes les plus frquentes, comme ls, qui sont normalement traites directement par le shell pour gagner en efcacit.
E. Viennet - GTR - v2.0
1

50

Introduction UNIX

de linitialisation du systme UNIX, un premier processus, nomm init, est cr avec un PID=1. init est lanctre de tous les processus. A bas niveau, ll ny a quune seule faon de donner naissance un nouveau processus, la duplication. Un processus peut demander au systme sa duplication en utilisant la primitive fork() (que nous tudions plus loin). Le systme cre alors une copie complte du processus, avec un PID diffrent. Lun des deux processus est ls de lautre. Il nest videment gure utile davoir deux copies du mme programme sexcutant dans le systme. Aprs duplication, le ls va changer de programme en utilisant la primitive exec(). Cette primitive conserve lidentit du processus mais remplace son code excutable (et ses donnes) par celui dune nouvelle commande. Voyons ce quil se passe lorsque quun shell excute la commande compress toto qui demande la compression du chier nomm toto : 1. le shell se duplique (fork) ; on a alors deux processus shell identiques. 2. le shell pre se met en attente de la n du ls (wait). 3. le shell ls remplace son excutable par celui de la commande compress ; 4. la commande compress sexcute et compacte le chier toto ; lorsquelle termine, le processus ls disparat. 5. le pre est alors ractiv, et afche le prompt suivant.

6.3

Manipulation de processus en langage C

Examinons maintenant les appels systmes utiliser pour crer un nouveau processus.

6.3.1

La primitive fork()

#include <unistd.h> int fork(); Lappel fork() duplique le processus. Lexcution continue dans les deux processus aprs lappel fork(). Tout se passe comme si les deux processus avaient appel fork(). La seule diffrence (outre le PID et le PPID) est la valeur retourne par fork() : dans le processus pre (celui qui lavait appel), fork() retourne le PID du processus ls cr ; dans le processus ls, fork() retourne 0.
E. Viennet - GTR - v2.0

CHAPITRE 6. LES PROCESSUS

51

Notons que le fork peut chouer par manque de mmoire ou si lutilisateur a dja cr trop de processus ; dans ce cas, aucun ls nest cr et fork() retourne -1. Un exemple de programme appelant fork() est donn page 52.

6.3.2 Les primitives getpid() et getppid()


Lappel systme getpid() retourne le PID du processus appelant. getppid() retourne le PID du pre du processus.

6.3.3 La primitive exec()


La primitive execlp() permet le recouvrement dun processus par un autre excutable (voir 6.2). int execlp( char *comm, char *arg, ..., NULL ); comm est une chane de caractres qui indique la commande excuter. arg spcie les arguments de cette commande (argv). Exemple : excution de ls -l /usr execlp( "ls", "ls", "-l", "/usr", NULL );

Notons que la fonction execlp() retourne -1 en cas derreur. Si lopration se passe normalement, execlp() ne retourne jamais puisque quelle dtruit (remplace) le code du programme appelant.

6.3.4 La primitive exit()


exit() est une autre fonction qui ne retourne jamais, puisquelle termine le processus qui lappelle. #include <stdlib.h> void exit(int status); Largument status est un entier qui permet dindiquer au shell (ou au pre de faon gnrale) quune erreur sest produite. On le laisse zro pour indiquer une n normale.

6.3.5 La primitive wait()


#include <sys/types.h> #include <sys/wait.h> int wait( int *st );
E. Viennet - GTR - v2.0

52

Introduction UNIX

/* Exemple utilisation primitive fork() sous UNIX * Emmanuel Viennet, Juin 1995 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> void main(void) { int pid; /* PID du processus fils */ int i; pid = fork(); switch (pid) { case -1: printf("Erreur: echec du fork()\n"); exit(1); break; case 0: /* PROCESSUS FILS */ printf("Processus fils : pid = %d\n", getpid() ); exit(0); /* fin du processus fils */ break; default: /* PROCESSUS PERE */ printf("Ici le pere: le fils a un pid=%d\n", pid ); wait(0); /* attente de la fin du fils */ printf("Fin du pere.\n"); } } TAB . 6.1 Exemple dappel de la primitive fork().

E. Viennet - GTR - v2.0

CHAPITRE 6. LES PROCESSUS

53

Lappel wait() permet un processus dattendre la n de lun de ses ls. Si le processus na pas de ls ou si une erreur se produit, wait() retourne -1. Sinon, wait() bloque jusqu la n de lun des ls, et elle retourne son PID. Largument st doit tre nul.

6.3.6 La primitive sleep()


#include <unistd.h> int sleep( int seconds ); Lappel sleep() est similaire la commande shell sleep. Le processus qui appelle sleep est bloqu durant le nombre de secondes spci, sauf sil reoit entre temps un signal. Notons que leffet de sleep() est trs diffrent de celui de wait() : wait bloque jusqu ce quune condition prcise soit vrie (la mort dun ls), alors que sleep attend pendant une dure xe. sleep ne doit jamais tre utilis pour tenter de synchroniser deux processus.

E. Viennet - GTR - v2.0

54

Introduction UNIX

E. Viennet - GTR - v2.0

Chapitre 7 Communications inter-processus


UNIX fournit plusieurs mcanismes permettant des processus sexcutant sur la mme machine dchanger de linformation. Nous tudions dans cette partie les signaux, les tubes et les smaphores. Nous naborderons pas ici les procdures de communication entre systmes distants, surtout bass sur le protocole TCP/IP.

7.1

Signaux asynchrones

Les signaux permettent davertir simplement un processus quun vnement est arriv (ils ressemblent aux vnements tudis en cours systme). Il existe environ 32 signaux prdnis, ayant chacun une signication. Il nest pas possible de dnir de nouveaux signaux. Les signaux sont envoys soit par le systme lui mme (en particulier lorsque le processus tente une opration illgale comme une division par zro ou un accs une zone mmoire ne lui appartenant pas), soit par un autre processus appartenant au mme utilisateur. Certains signaux, comme le numro 9, entranent toujours la mort du processus qui les reoit. Pour dautres au contraire1 , le processus peut spcier une fonction traitante (handler) qui sera automatiquement appele par le systme lors de la rception dun signal particulier (voir lappel systme signal() plus loin). Depuis le shell, on peut envoyer un signal un processus en utilisant la commande kill (voir page 37). Son usage le plus courant est sans doute de provoquer la n dun processus (le tuer), grce au signal 9.

7.1.1 Manipulation des signaux en langage C


On peut envoyer un signal un autre processus en appelant la primitive
1

Voir man signal pour plus dinformations sur chaque type de signal.

E. Viennet - GTR - v2.0

56 Numro 1 8 9 10 11 12 17 18 19 29 Nom HUP FPE KILL USR1 SEGV USR2 CHLD CONT STOP WINCH

Introduction UNIX Signication n de session exception calcul virgule ottante n du processus (non modiable) dnissable par lutilisateur rfrence mmoire invalide dnissable par lutilisateur terminaison dun ls reprise dun processus stopp stoppe le processus redimensionnement de fentre

TAB . 7.1 Quelques signaux important dnis par tous les systmes UNIX. La liste complte est dnie sur chaque systme dans le chier include <signal.h>. int kill( int pid, int signum ) qui envoie le signal de numro signum au processus de PID pid. Pour spcier quune fonction C doit tre appele lors de la rception dun signal non mortel, on utilise2 void (*signal(int signum, (void *handler)(int))))(int); Largument handler est une fonction C qui prend un entier en argument et sera automatiquement appele lors de la rception du signal par le processus. Voici un exemple de fonction traitante : void traite_signal_usr1( int signum ) { printf("signal %d recu.\n", signum ); } Cette fonction est installe par lappel : signal( SIGUSR1, traite_signal_usr1 ); Notons que dans certaines versions dUNIX, le traitant doit tre rinstall chaque fois que le signal est reu (pour cela, appeler signal() dans la fonction traitante). On peut aussi spcier que lon dsire ignorer un type de signal en utilisant la constante SIG_IGN : signal( numero_signal_a_ignorer, SIG_IGN );
Nous prsentons lancienne primitive UNIX signal() ; la norme POSIX a introduit une nouvelle interface.
E. Viennet - GTR - v2.0
2

CHAPITRE 7. COMMUNICATIONS INTER-PROCESSUS

57

Processus A

Processus B

F IG . 7.1 Tube de communication bidirectionnelle entre deux processus A et B.

7.2

Les tubes

Les tubes permettent lchange bidirectionnel de donnes entre deux processus sexcutant sur la mme machine. Nous avons vu dans la section 3.6.2 comment le shell permet de manipuler trs facilement des chanes de processus relis par des tubes.

7.2.1 Lancement dune commande avec popen()


Une premire utilisation trs pratique des tubes est le lancement dune commande par un programme C. Nous avons vu plus haut que lappel system() lanait une commande ; cependant il nest alors pas possible de rcuprer directement la sortie de la commande. La fonction popen() lance un processus excutant la commande voulue et relie ce processus lappelant par un tube unidirectionnel. Les deux processus sexcutent alors en parallle. FILE *popen( char *command, char *mode ); int pclose( FILE *stream ); Le paramtre mode indique le sens du tube ("w" en criture, "r" en lecture). La commande est habituellement un ltre. Par exemple, supposons que nous voulions compter le nombre de ligne dans un chier texte nomm texte.txt" . Une premire solution est douvrir le chier avec fopen(), de le lire en comptant le caractres n de ligne jusqu arriver au bout, puis de le refermer. Une autre solution, plus simple, est dutiliser la commande existante wc (voir page 36), comme suit : char res[256]; FILE *df = popen( "wc -l
E. Viennet - GTR - v2.0

/* buffer pour resultat */ texte.txt", "r" );

58 fgets( res, 255, df ); pclose( df ); int nblignes = atoi( res );

Introduction UNIX /* lecture du resultat */ /* fermeture du tube */ /* conversion en entier */

7.2.2

Cration dun tube avec pipe()

Il est parfois ncessaire dchanger de linformation dans les deux sens entre deux processus (modle client/serveur, etc.). En langage C, lappel systme pipe() permet la cration dun nouveau tube. Le tube est alors reprsent par un couple de descripteurs, lun pour crire, lautre pour lire. #include <unistd.h> int pipe( int filedes[2]); En cas derreur, la valeur retourne est diffrente de zro. pipe() cre une paire de descripteurs et les place dans le tableau filedes[]. filedes[0] est utilis pour lire dans le tube, et filedes[1] pour y crire. Pour linstant, il ny a personne lautre extrmit du tube. Cest pourquoi lappel pipe() est gnralement suivi par la cration dun processus ls avec lequel on va communiquer. Dans ce contexte, lappel systme dup2() est trs utile. int dup2( int newfd, int oldfd ); dup2() ferme le descripteur oldfd (sil est ouvert) puis le remplace par le descripteur newfd. Lappel dup2() permet par exemple de remplacer lentre standard dun processus par la sortie dun tube existant.

7.3

Synchronisation : smaphores

Les smaphores sont des outils de synchronisation trs pratiques pour grer laccs concurrent (cest dire simultan) de plusieurs processus une ressource critique (non partageable, par exemple un priphrique). UNIX systme V introduit une implmentation trs complte des smaphores, qui est maintenant disponible dans presque ( ?) toutes les versions POSIX. Nous allons dtailler les appels systmes permettant de manipuler des smaphores en langage C. Ces primitives sont plus gnrales que celles vues en cours (P(), V()). Cest pourquoi leurs paramtres semblent compliqus. Nous nexpliquons ici que le minimum ncessaire lutilisation de base. #include <sys/sem.h> int semget( key_t key, int nbsems, int flags );
E. Viennet - GTR - v2.0

CHAPITRE 7. COMMUNICATIONS INTER-PROCESSUS

59

semget() est utilis soit pour crer un nouveau smaphore, soit pour rcuprer lidenticateur dun smaphore existant. Retourne un identicateur (nombre entier utilis dans les autres primitives), ou -1 en cas derreur. Le paramtre key est un entier qui est une sorte de nom du smaphore, permettant tous les processus de le reprer. On lobtient laide des appels getcwd() et ftok() que nous ne dtaillons pas ici (cf TD). Le paramtre ags donne les droits sur le smaphore. Sil comporte la valeur IPC_CREAT, un nouveau smaphore est cr ; sinon, un smaphore rcupre un smaphore dja existant. int semctl( int semid, int num, int cmd, arg ) permet de changer la valeur du semaphore identi par semid. Utilis pour donner la valeur initiale du smaphore aprs sa cration. int semop( int semid, sops, nops ) applique une opration sur le smaphore (augmente ou baisse la valeur). Si la valeur devient ngative, met le processus en attente (cf cours sur les smaphores). Voir lutilisation de ces primitives en TD.

7.4

Autres techniques de communication

Le systme UNIX fournit aussi dautres moyens de communication interprocessus que nous ntudierons pas ici. Nous mentionnerons simplement les segments de mmoire partage (deux processus sur la mme machine peuvent partager une partie de leurs donnes), et les sockets (utiliss surtout pour les communications distantes avec TCP/IP).

E. Viennet - GTR - v2.0

60

Introduction UNIX

E. Viennet - GTR - v2.0

Bibliographie
Nous indiquons ici quelques livres de rfrence sur UNIX. Ces ouvrages dpassent parfois le niveau DUT. UNIX, Guide de ltudiant de Harley Hahn (Dunod, 1994) donne une bonne introduction gnrale. Concernant la programmation systme en C sous UNIX, nous conseillons louvrage en franais de J.M. Rifet, La programmation sous UNIX publi chez Ediscience. Une bonne introduction ladministration dun systme sous UNIX est donne par UNIX System Administration Handbook, E. Nemeth, G. Snyder et Scott Seebass, Prentice Hall. Enn, larchitecture du noyau est dtaille dans The design and Implementation of the 4.3BSD UNIX Operating System, de Lefer et al., Addison Wesley, ouvrage prcis mais dpassant de loin le niveau DUT. Dautre part, une bonne version du systme UNIX nomme Linux peut sinstaller sur PC (386 et plus). Le systme complet est vendu sur CD-ROM pour environ 100F. Il ne sagit pas dune version rduite, mais dune implmentation trs complte du systme UNIX3

Linstallation de Linux ncessite de bonnes connaissances sur le PC, 200Mo environ despace disque (plus de 1Go pour installer automatiquement les distributions rcentes), un lecteur de CDROM et une bonne matine de travail.
E. Viennet - GTR - v2.0

62

Introduction UNIX

Lexique pour comprendre le manuel UNIX


Le manuel en ligne dUNIX est la principale source dinformation sur les commandes du systme. Il est rdig dans un anglais technique trs simple qui devrait vous tre accessible sans efforts aprs acclimatation (de nombreuses pages sont maintenant traduites). Le lexique ci-dessous dni les termes informatiques les plus couramment utiliss dans ce manuel. blank vide (ligne vide, cran vide). by default par dfaut, ce qui se passe si lon ne spcie rien dautre. byte octet (8 bits). comma virgule. concatenate concatner, cest dire mettre bout bout. directory rpertoire. le chier. handler traitant (dinterruption, de signal, ...), cest dire fonction grant une situation spcique. head tte (dbut). inhibit inhiber (empcher, interdire). job travail, tche (processus contrl par un shell). key touche (littralement cl). parse analyser la syntaxe. path chemin daccs un chier ou rpertoire. pipe tube (communication interprocessus). prompt demander ( lutilisateur) ; ce qui safche au dbut des lignes dun interprteur de commandes. quote guillemet ; double quote = " ; backquote = . recursive rcursif. return retourner (dune fonction) ; touche entre. shell littralement coquille ; dsigne sous UNIX un interprteur de commandes interactif. skip sauter. sort trier. space espace. status tat. syntax syntaxe. tail queue (n). word mot.

E. Viennet - GTR - v2.0

63

Introduction UNIX

Index
.cshrc, 25 .prole, 25 alias, 29 argc, 44 bash, 24, 25 calloc, 44 cat, 26, 28 cc, 41, 42 cd, 17, 26 cerr, 28 chmod, 20, 26, 30 compress, 33 cp, 26, 36 csh, 24, 25 date, 33 df, 40 diff, 33 DOS, 12 du, 40 dup2, 58 echo, 26 Environnement (variables), 25, 44 exec, 50, 51 exit, 51 le, 33 nd, 33 fork, 50 free, 44 getpid, 51 grep, 37
E. Viennet - GTR - v2.0

head, 34 inode, 27 kill, 29, 37, 56 Langage C, 12, 41, 61 Linux, 12, 61 login, 15 lpq, 34 lpr, 34 lprm, 34 ls, 20, 27 mtacaractres, 24 Macintosh, 12 make, 42 makele, 43 malloc, 44 man, 34, 62 mkdir, 27 more, 35 Mot de passe, 15, 21 mount, 39 Multics, 12 mv, 27 nice, 38 Perl, 24 popen, 57 ps, 37, 49 pwd, 17, 27 Python, 24 Redirections, 27 Ritchie, 12

rm, 27 Smaphores, 58 script, 30 sh, 24, 25 shell, 23 signal, 37, 55, 56 sleep, 29, 53 Solaris, 12 sort, 37 stderr, 28 swap, 15 system, 47 tail, 35 tar, 35 tcsh, 24, 25 Thompson, 12 tr, 37 Tubes, 28, 57 uncompress, 36 uniq, 37 uudecode, 36 uuencode, 36 vi, 31 wait, 51 wc, 36, 58 which, 29, 36 who, 36 Windows, 12 zcat, 36