Académique Documents
Professionnel Documents
Culture Documents
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.
Introduction UNIX
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
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
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 . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
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() . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
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
10
Introduction UNIX
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
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
13
1.3
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.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
15
16
Introduction UNIX
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
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
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
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.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
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
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.
22
Introduction UNIX
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
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
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
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.
26
Introduction UNIX
3.5
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.
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
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
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
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
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
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.
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.
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
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
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
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
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
39
compress
ls
zcat
IUT
DEUG
PROFS
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).
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.
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
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"
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
46
Introduction UNIX
0 1 2 3
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
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
47
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
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.
48
Introduction UNIX
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
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
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.
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.
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().
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.
54
Introduction UNIX
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.
Voir man signal pour plus dinformations sur chaque type de signal.
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
57
Processus A
Processus 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.2
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
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
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).
60
Introduction UNIX
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
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