polycop

download polycop

If you can't read please download the document

Transcript of polycop

Algorithmique et programmation dans l'environnement C/UnixMamoun ALISSALIOctobre 1998

Support de cours

Universit du Maine Le Mans

Sommaire1 Introduction au syst me d'exploitation Unix1.1 1.2 1.3 1.4 1.5 1.6 1.7 D buter Unix . . . . . . . . . . Environnement de l'utilisateur Introduction au C-Shell . . . . Notion de syst me de chiers . Fichiers texte . . . . . . . . . . La programmation en C-Shell . Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 6 11 16 21 27

3

2 Le langage C2.1 2.2 2.3 2.4 2.5

Le langage C en bref (Rappels) . . . . . De l'applicatif l'imp ratif : de CAML Structure de donn es en C . . . . . . . . Acc s aux chiers . . . . . . . . . . . . . La compilation S par e . . . . . . . . .

.. C .. .. ..

31

31 36 36 45 46

3 Algorithmique et structures de donn es avanc es3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8

Fondements et principes de l'algorithmique . . . . . . . . . . Exemple : calcul de la somme des N premiers entiers positifs . Pratique du d veloppement d'algorithmes . . . . . . . . . . . Notion de complexit d'algorithme . . . . . . . . . . . . . . . Algorithmes de recherche dans un tableau . . . . . . . . . . . Algorithmes de tri de tableau . . . . . . . . . . . . . . . . . . Types de donn es abstraits . . . . . . . . . . . . . . . . . . . Listes Cha n es . . . . . . . . . . . . . . . . . . . . . . . . . . Piles et queues . . . . . . . . . . . . . . . . . . . . . . . . . . Arbres binaires . . . . . . . . . . . . . . . . . . . . . . . . . . Description du probl me . . . . . . Analyse . . . . . . . . . . . . . . . Conception . . . . . . . . . . . . . Notions de module et de modularit Premi re implantation . . . . . . . Am liorations . . . . . . . . . . . . Implantation des am liorations . . Version 4 . . . . . . . . . . . . . . .... .... .... ... .... .... .... .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55

55 55 57 57 57 61 70 71 77 77 79 79 80 82 82 88 90 94

4 Application: Base de Donn es Universitaire

79

1

2

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

Chapitre 1

Introduction au syst me d'exploitation

Unix

1.1 D buter Unix

Le r le premier d'un syst me d'exploitation est de pr senter un ordinateur sous une forme abstraite facilitant son utilisation et sa programmation. La gure 1.1 r sume de mani re simpli e les principales abstractions mises en uvre par Unix et leurs relations avec les couches basses (mat riel et noyau) d'un c t , et l'utilisatuer de l'autre c t .

1.1.1 La structure d'Unix

11111111111111 00000000000000 11111111111111 00000000000000 Matriel 11111111111111 00000000000000 Shell libc.a 11111111111111 00000000000000 Noyau Identification stdio.h 11111111111111 00000000000000 libm.a 11111111111111 00000000000000 math.h nom de login ... 11111111111111 00000000000000 ... mot de passe 11111111111111 00000000000000 Gestion de groupe 11111111111111 00000000000000 Fichiers00000000000000 11111111111111 Donnes 11111111111111 00000000000000 Commandes 11111111111111 00000000000000 (fichiers) ls 11111111111111 00000000000000 cd cat Connecteurs 11111111111111 00000000000000 pwd cc 11111111111111 00000000000000 de priph. 11111111111111 00000000000000 mkdir ... 11111111111111 00000000000000 11111111111111 00000000000000 11111111111111 00000000000000 Mmoire 11111111111111 00000000000000 Gestion de 11111111111111 00000000000000 11111111111111 00000000000000 Processus Processeur 11111111111111 00000000000000 dition de prog. (CPU) 11111111111111 00000000000000 11111111111111 00000000000000 Compilation Utilisation 11111111111111 00000000000000 11111111111111 00000000000000 Edition de liens 11111111111111 00000000000000 Excution 11111111111111 00000000000000 Programmation 11111111111111 00000000000000 11111111111111 00000000000000 11111111111111 00000000000000 Dynamique

Statique

Bibiliothques

Fig.

1.1

Environnement

Unix

comme environnement d'utilisation et de programmation.

3

4

Chapitre 1 Introduction

Unix

1.1.2 Caract ristiques d'Unix

Cr en 1969 aux laboratoires Bell ; Unix a beaucoup volu et a donn naissance une grande famille de syst mes d'exploitation (plus de 100 syst mes Unix ou Unix-like ). Beaucoup d'e orts ont t faits r cemment pour tablir des normes, doter le syst me d'interface graphique, etc. Un syst me d'exploitation appartient la famille Unix si : il est multi-t che, multi-utilisateur ; crit en C ; poss de un syst me de chiers hi rarchique ; int gre les E/S dans les op rations sur les chiers ; fournit une collection sp ci que d'appels syst me : fork, exec, pipe, etc. ; fournit des outils tels que : cc, awk, grep et troff ; permet le choix de l'interpr teur de commandes (shell).

1.2 Environnement de l'utilisateurxer les r gles de communication. Sous un environnement graphique on peut avoir plusieurs fen tres simulant chacune un terminal, l'utilisateur est alors connect la machine autant de fois qu'il a de fen tres. La commande stty permet de consulter ou de modi er les param tres du terminal tels que la vitesse de communication ou l'interpr tation des caract res envoy s par le clavier :stty -a] -g] options du terminal]

Un terminal est reli l'ordinateur par une ligne de communication identi e par un chier p riph rique (device le ). C'est un chier sp cial (cf. 1.4.2) qui se trouve dans le r pertoire /dev et qui sert

1.2.1 Le terminal

sans param tre stty a che les caract ristiques g n rales du terminal.

Optionsdonne toutes les informations disponibles ; -g permet de g n rer un chier contenant les informations.-a

Exemple1

(alissali@lola) ~>stty erase ^H

xe Ctrl-H comme caract re d'e acement. Sous Unix un utilisateur est identi de mani re unique par un num ro d'utilisateur . Il est aussi caract ris par son nom de login , son mot de passe , son r pertoire personnel et son groupe . Ces informations et bien d'autres sont r pertori es dans le chier /etc/passwd. Elles sont accessibles par di rentes commandes (cf. ci-dessous). Chaque utilisateur appartient un ou plusieurs groupes. Cela permet de classer les di rents utilisateurs et introduit un niveau de s curit suppl mentaire concernant l'acc s aux chiers. Le chier /etc/group contient, pour chaque groupe, un num ro d'identi cation et la liste des utilisateurs qui en sont membres. En cours de session il est possible pour un utilisateur de changer de groupe.logname

1.2.2 Caract ristiques de l'utilisateur

A che le nom d'utilisateur.-g | -u ] -nra ]

id

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

1.2 Environnement de l'utilisateur

5

A che le nom de l'utilisateur, son num ro d'identi cation (UID : User IDentity ), ainsi que le num ro du groupe actuel (GID : Group IDentity ) et la liste des groupes auxquels il appartient. Permet un utilisateur de changer de groupe, condition qu'il en fasse partie. Sans param tre elle replace l'utilisateur dans son groupe d'origine.chown utilisateur fichiers chgrp groupe fichiers newgrp -] groupe]

Ces deux commandes, CHange OWNer et CHange GRouP, permettent respectivement de changer l'utilisateur ou le groupe propri taire des chiers donn s en argument. Elles ne peuvent tre utilis es que par le propri taire des chiers ou par l'administrateur (super user ).

Exemple

1 2 3 4 5 6 7

(alissali@lola) ~>logname alissali (alissali@lola) ~>id uid=10017(alissali) gid=100(cuc) groups=100(cuc), 215(lium) (alissali@lola) ~>newgrp lium (alissali@lola) ~>id uid=10017(alissali) gid=215(lium) groups=100(cuc), 215(lium)

1.2.3 Interpr teurs de commandes

mation sp ci que. Il op re comme suit : 1 boucle l ' i n f i n ie 2 crire in vit e 3 lire lig n e de commande 4 In t e r p r t a t io n de la lig n e de commande : 5 In t e r p r t a t io n des c a r a c t r e s sp ciaux ; 6 Extraction de la commande et , le cas ch ant , des options et 7 des arguments ; 8 Ex cution commande ( avec options et arguments )9

Pour acc der aux services fournis par le syst me, les utilisateurs passent par un interpr teur de commandes ou shell. Il s'agit d'un utilitaire interactif capable d'interpr ter un langage de program-

fin boucle

Remarques L'invite (prompt) est un message (cha ne de caract res) qui indique que le shell est pr t accepter

une nouvelle commande. L'invite peut tre con gur pour indiquer di rentes informations telles que le nom de la machine, le nom de login de l'utilisateur et le r pertoire courant de travail. La ligne de commande se termine par un retour- -la-ligne. Les caract res sp ciaux (cf. 1.3.1) sont des caract res qui portent chacun un sens pr cis compris par le shell. Une commande peut tre interne (ou incorpor e built-in ), interpr t e directement par le shell, ou une commande Unix (programme ex cutable). La commande incorpor e exit termine l'ex cution du shell. Il existe une vari t de shells, dont les plus connus sont : sh (Bourne Shell), jsh (Job Shell), csh (C-shell), tcsh (Turbo C-shell), ksh (Corn Shell), bash (Bourne Again Shell). Ces interpr teurs ont des caract ristiques communes. Ils o rent tous : la m me forme pour la ligne de commande :commande options arguments

certaines commandes ne prennent pas d'arguments, d'autres pas d'options ; la possibilit d'ex cuter des commandes en arri re plan ;Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

6

Chapitre 1 Introduction

Unix

les redirections des Entr es/Sorties ; les tubes (cf. 1.5.3) qui permettent d'envoyer la sortie d'un processus (cf. 1.7) (programme en cours d'ex cution) vers un autre ; les caract res sp ciaux. Ils se di rencient par : la syntaxe et les capacit s du langage qu'ils interpr tent (structures de contr le, d nition et manipulation des variables, etc.) ; certaine caract res sp ciaux et mises en uvre comme celles de la redirection des E/S et les tubes ; certaines commandes internes (ou incorpor es) ; certaines capacit s d'interactions (plus ou moins volu es) avec l'utilisateur. Le paragraphe suivant donne quelques exemples sur sh (qui est le shell original d'Unix) et csh qu'on tudiera par la suite.

Exemples

Bourne Shell (sh) : echo texte commande interne, a che texte sur l' cran ; times commande interne, a che le temps consomm par toutes les commandes ex cut es par le shell depuis son lancement ; who commande Unix, a che les utilisateurs actuellement connect s ; time ls -R commande Unix, ex cute ls -R puis a che son temps d'ex cution. C-Shell (csh) : echo texte commande interne, quivalente echo de sh ; alias lr 'ls -R' commande interne, d nit l'alias lr quivalent ls -R ; time lr commande interne, quivalente la commande Unix du m me nom. Pour utiliser celle-ci il faut donner son nom complet (chemin d'acc s absolu) /bin/time. set monFichier = prog d nit la variable monFichier de valeur prog if (-e $monFichier) echo fichier existant value monFichier (prog apr s la commande pr c dente) et a che le message si ce chier existe.

1.3 Introduction au C-Shell

1.3.1 Interpr tation des commandes~>cd pub/ExemplesCours/ ~/pub/ExemplesCours>cd.. cd..: Command not found. ~/pub/ExemplesCours>cd .. ~/pub>

Avant l'ex cution d'une commande, csh interpr te certains caract res dont les suivants 1 : s parateurs : espace, tabulation et retour-chariot (Enter)

1 2 3 4 5

La commande en ligne 2 n'est pas comprise et provoque le message de la ligne 3. Ceci est d l'absence du s parateur entre la commande cd et son argument ...1. Pour un shell ou pour une commande, les termes entr e et sortie d signent les donn es, la plupart du temps stock es dans des chiers, consomm es et produites par une commande. Ils peuvent aussi d signer le clavier (entr e standard) et l' cran (sortie standard) qui sont trait s comme des chiers (cf. 1.4.2) par Unix.Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

1.3 Introduction au C-Shell$1 2 3

7

: r f rence aux variables~/pub>set exemples = ~/pub/ExemplesCours ~/pub>cd $exemples ~/pub/ExemplesCours>

La premi re ligne d nit la variable exemples en lui attribuant une valeur, celle-ci est substitu e avant l'ex cution de la commande. On remarque que le nouveau r pertoire indiqu par l'invite (ligne 3) correspond bien la valeur de exemples. caract res sp ciaux dans les noms de chiers : ? : d signe n'importe quel caract re1 2

~/pub/ExemplesCours>ls triBulTab.? triBulTab.c triBulTab.h triBulTab.o

L'argument de la commande ls est interpr t comme tous les chiers dont le nom est compos de triBulTab. suivi de un (seul) caract re quelconque. * : d signe n'importe quelle s quence de caract res1 2 3 4 5 6 7 8 9

~/pub/ExemplesCours>ls *.c affiche.c rechDichRec.c explMdfParFct.c triBulPtr.c rechDichIt.c triBulTab.c ... ~/pub/ExemplesCours>ls tri*.c triBulPtr.c triBulTest.c triBulTab.c triDirectRec.c triDirectTest.c

L'argument de la commande ls en ligne 1 est iterpr t comme tous les chiers dont le nom se termine par .c. En ligne 6 on ajoute la contrainte : commence par tri....]1 2

: choix d'un caract res parmi ceux contenus entre les crochets

~/pub/ExemplesCours>ls affiche. hc] affiche.c affiche.h

Ici on contraint le choix du caract re en n du nom h ou c. redirection des entr es/sorties : > : redirige la sortie vers un chier (au lieu de l' cran sortie standard).1 2 3 4 5 6 7

~/pub/ExemplesCours>ls > liste ~/pub/ExemplesCours>more liste Makefile affiche.c affiche.h affiche.o ...]

La commande en ligne 1 redirige la sortie de ls vers le chier liste, rien n'est a ch l' cran. Ensuite la commande more a che les contenus de liste l' cran, on remarque qu'ils correspondent bien au r sultat de ls. < : redirige l'entr e vers un chier (au lieu du clavier entr e standard).1 2 3 4 5 6

~/pub/ExemplesCours>more < liste Makefile affiche.c affiche.h affiche.o ...]

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

8

Chapitre 1 Introduction

Unix

Sans arguments la commande more attends une entr e au calvier, mais le caract re sp cial < lui indique que l'entr e vient du chier liste. Avec un fonctionnement totalement di rent, cette commande est quivalente celle de la ligne 2 de l'exemple pr c dent. j : tube, communique la sortie d'une commande l'entr e d'une autre.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

~/pub/ExemplesCours>ls | more Makefile affiche.c affiche.h affiche.o ...] ~/pub/ExemplesCours>nl affiche.c 1 #include 2 #include"affiche.h" void affiche(int tab ], int taille) { ...] 8 } /* END affiche */ ~/pub/ExemplesCours>cat affiche. hc] | nl | lp 3 4

La ligne 1 indique que la sortie de ls doit tre achemin vers la commande more au lieu d' tre a ch l' cran. C'est la commande more qui e ectue l'a chage 2. Ceci est quivalent aux deux commandes (lignes 1 et 2) de l'exemple sur > ci-haut, mais sans l'utilisation d'un chier interm diaire. La commande nl (Number lines ), ligne 7, permet de num roter les lignes d'un chier. En ligne 13 elle e ectue cette op ration sur les deux chiers affiche.c et affiche.h a ch s ensemble l' cran gr ce la commande cat. Ensuite, le deuxi me tube envoie le r sultat directement l'impression (commande lp). ; : s parateur de commandes1 2

~/pub/ExemplesCours>cd .. ; ls BDU ExemplesCours

L'utilisation de ; permet d'encha ner les commandes, ici au moment de l'ex cution ls on se trouve d j dans le r pertoire p re (suite l'ex cution de cd). quotations (emp chent l'interpr tation) : \ : emp che l'interpr tation du caract re suivant1 2 3 4 5

~/pub>echo un petit message > fichierMsg ~/pub>more fichierMsg un petit message ~/pub>echo un petit message \backslash{}> fichierMsg un petit message > fichierMsg

Dans le premier cas, ligne 1, le caract re > est interpr t , ce qui a pour cons quence de diriger le texte a ch par echo dans le chier fichierMsg, ce qu'on v ri e en lignes 2 et 3. Dans le deuxi me cas, le \ emp che l'interpr tation de >, celui-ci est consid r comme un caract re normal, par cons quent tout ce qui suit est a ch l' cran (ligne 5). ' ' : emp che l'interpr tation de toute la s quence :1 2 3 4

~/pub>echo $exemples /export/home/ens/cuc/alissali/pub/ExemplesCours ~/pub>echo '$exemples' $exemples

2. Ceci est utile lorsque la liste est trop longue pour tre a ch e en une seule fois l' cran; more e ectue un a chage page par page.Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

1.3 Introduction au C-Shell

9

Avant d'ex cuter la commande en ligne 1, exemples est remplac par sa valeur d'o le r sultat en ligne 2. la deuxi me ex cution on emp che la s quence $exemples d' tre interpr t e, elle est donc a ch e telle que. On obtient le m me r sultat avec :1 2

~/pub>echo $exemples $exemples

Ici on emp che l'interpr tation du seul caract re $, exemples n'est donc plus interpr t e comme une variable et le tout est a ch comme une cha ne de caract res ordinaire. " " : emp che l'interpr tation de la s quence sauf certains caract res (comme $) & : ex cution en arri re plan .1 2

~/pub>emacs & ~/pub>

Lorsqu'une commande est lanc e partir d'un shell, celui-ci attend la n de l'ex cution de la commande pour reprendre la main et permettre l'utilisateur d'entrer d'autres commandes. L'ex cution en arri re plan indique au shell de continuer op rer en parall le avec la commande ce qui est particuli rement utile dans le cas des commandes interactives telles que emacs. On remarque, ligne 2, que l'invite a t a ch tout de suite sans attendre la n de l'ex cution d'emacs. Comme tous les shells, csh maintient un ensemble de variables pr d nies qui d nissent le contexte courant. Parmi ces variables, les plus utilis es sont : Variablecwd home path prompt shell status user

1.3.2 Variables pr d nies

Valeur nom complet (chemin d'acc s absolu) du r pertoire courant . r pertoire racine (ou personnel) de l'utilisateur ( le caract re dans un nom de chier prend la valeur de cette variable). liste des r pertoires o seront cherch es les commandes. cha ne a ch e dans l'invite. Son absence indique qu'il s'agit d'un shell non interactif. nom du chier ex cutable du programme csh. tat de l'ex cution de la derni re commande. Pour un programme C prend la valeur retourn e par main. nom de l'utilisateur.Tab.

1.1 Variables internes (pr d nies) du C-Shell.

Exemples1 2

Sur la machine lola le shell par d faut est tcsh, pour travailler en csh il faut lancer l'interpr teur :

(alissali@lola) ~>csh (alissali@%m %~)

On remarque le changement d'invite car les s quences qui commencent par % dans prompt sont sp ci ques tcsh : %m et % , interpr t e par tcsh comme le nom de la machine et le r pertoire courant , sont incomprises de csh. Par cons quent, elle sont a ch es telles que. Il faut alors modi er l'invite l'aide de l'a ectation (commande interne set) :1 2 3 4 5 6

(alissali@%m) %~>set cwd /export/home/ens/cuc/alissali home /export/home/ens/cuc/alissali path (/usr/bin /usr/local/bin .) prompt (alissali@%m) %~> shell /bin/csh

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

107 8 9 10 11

Chapitre 1 Introduction

Unix

status 0 user alissali ... (alissali@%m) %~>set prompt='cmd. no. ! > ' cmd. no. 3 >

La premi re utilisation de set (sans argument) permet de consulter les variables actuellement d nies, en particulier l'invite (prompt). La deuxi me utilisation donne une nouvelle valeur cette variable, le caract re ! dans l'invite est interpr t par csh comme tant le num ro de la commande courante, comme on le voit en ligne 11. On e ectue quelques op rations pour observer le fonctionnement et l'utilisation de ces variables. Un changement du r pertoire courant modi e la valeur de cwd :1 2 3 4 5

cmd. no. 3 > cd pub cmd. no. 4 > set ...] cwd /export/home/ens/cuc/alissali/pub ...]

Pour ex cuter une commande, csh se r f re la valeur de path pour savoir dans quels r pertoire chercher l'ex cutable correspondant. L'utilisateur peut obtenir la m me information gr ce la commande which :1 2

cmd. no. 5 > which ls /usr/bin/ls

ce qui veut dire que l'ex cutable ls se trouve dans le r pertoire /usr/bin, celui-ci fait bien partie de la valeur de path (cf. 1er exemple ci-dessus). Si on supprime ce r pertoire de la valeur de path, csh ne trouve plus la commande (message d'erreur ligne 3) :1 2 3

cmd. no. 6 > set path='(/usr/local/bin .)' cmd. no. 7 > ls ls: Command not found.

De plus la valeur de d roulement) :1 2

status

est mise jour pour indiquer une erreur (la valeur est 0 en cas de bon

cmd. no. 8 > echo $status 1

On termine l'ex cution de csh, on retrouve tcsh et son invite :1 2

cmd. no. 9 > exit cmd. no. 10 > (alissali@lola) ~>

Une variable d'environnement est une cha ne de caract res compos e d'un nom et d'une valeur. Les variables d'environnement servent communiquer le contexte d'ex cution actuel toute commande ex cut e par le shell. Quelques variables d'environnement sont pr d nies, les plus importantes sont USER, HOME et PATH qui prennent les m mes valeurs que leurs homonymes parmi les variables internes. PWD a la m me valeur que la variable interne cwd. La command interne setenv permet d'a ecter ou de consulter la valeur d'une variable d'environnement. Pour illustrer la di rence entre une variable interne et une variable d'environnement, l'exemple suivant d nit une variable de chaque type (respectivement maVar et MAVAR) 3, puis lance un nouveau csh. Seule la variable d'environnement est export e vers (reconnue par) ce nouveau shell 4.1 2

1.3.3 Variables d'environnement

(alissali@lola) ~>csh (alissali@%m) %~>set prompt='csh: ! >'

3. Les variables d'environnement sont toujours en majuscules, les variables internes en minuscules. Il s'agit d'une convention et non pas d'une r gle lexicale. 4. L'exemple ne montre que les variables qui servent notre propos.Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

1.4 Notion de syst me de chiers3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

11

csh: 2 >set maVar = 'une variable interne' csh: 3 >set maVar une variable interne ...] prompt csh: ! > csh: 4 >setenv MAVAR ``UNE VAR. D'ENV. csh: 5 >setenv HOME=/export/home/ens/cuc/alissali PATH=/usr/bin:/usr/local/bin:. USER=alissali MAVAR=UNE VAR. D'ENV. ...] csh: 6 >csh (alissali@%m) %~>set prompt (alissali@%m) %~> ...] (alissali@%m) %~>setenv HOME=/export/home/ens/cuc/alissali PATH=/usr/bin:/usr/local/bin:. USER=alissali MAVAR=UNE VAR. D'ENV. ...]

La premi re ligne lance un csh, la deuxi me modi e l'invite. Ensuite on d nit en l'initialisant une nouvelle variable (maVar, ligne 3), et on v ri e le bon d roulement de l'op ration (lignes 4 et 5), ainsi que la nouvelle valeur de prompt (ligne 7). On r p te les m mes op rations avec une variable d'environnement, MAVAR, en observant les valeurs de quelques autres variables d'environnement (lignes 8 13). Lorsqu'on lance un nouveau csh, on observe que prompt retrouve son ancienne valeur et que maVar n'est pas d nie : les variables internes ne sont pas communiqu es au nouveau processus. Par contre les variables d'environnement, y compris MAVAR, sont bien reconnues par le nouveau shell. Au lancement d'un interpr teur de commande celui-ci ex cute les commandes qui se trouvent dans un chier de con guration . Dans le cas du C-Shell ce chier s'appelle .cshrc et se trouve (comme pour les autres interpr teurs) dans le r pertoire de l'utilisateur (HOME). Il peut contenir des modi cations de variables ou de variables d'environnement pr d nies, des d nitions de variables et d'autres commandes comme la d nition d'alias.

1.3.4 Con guration du C-Shell

Exemple1 2 3 4 5 6

csh: 10 >more .cshrc set path=(/usr/bin /usr/local/bin .) set prompt="csh: ! >" alias rm 'rm -i' alias dir 'ls -aF' alias x logout

prompt

La premi re ligne a che les contenus de et la d nition de quelques alias.

.cshrc

, o on trouve l'initialisation des variables

path

et

1.4 Notion de syst me de chiers1.4.1 La table des i-nodes

Un syst me de chiers d crit l'ensemble de des donn es stock es sur un support permanent de stockage (disque, CD-ROM, etc.). Il est compos des donn es proprement dites, organis es en chiers et en r pertoires, et de diverses informations de gestion.

La table des i-nodes fait partie des informations de gestions d'un syst me de chiers. Chaque l ment (i-node ou index node) de la table d crit enti rement un chier et chaque chier est identi de mani reIntroduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

12

Chapitre 1 Introduction

Unix

unique par l'indice (i-node number ) de son entr e. Chaque i-node contient les informations suivantes : type de chier et permissions d'acc s ; identi cation du propri taire et de son groupe ; nombre de liens sur le chier ; taille du chier en octets (bytes ) ; dates du dernier acc s, derni re modi cation, derni re modi cation de l'i-node ; tableau de pointeurs sur les blocs de donn es. Mise part la derni re (le tableau de pointeurs) ces informations peuvent tre visualis es par la commande ls (cf. 1.4.4) par exemple. La notion de chier sous Unix regroupe : les chiers normaux : un chier normal (texte, donn es, objet, ex cutable, etc.) est une s quence d'octets sans aucune organisation interne sp ci que ; les r pertoires : un r pertoire est un chier sp cial dans lequel sont inscrits les liens du r pertoire. un lien est constitu de l'association entre un nom et un num ro d'i-node ; les tubes : un tube est un chier sp cial permettant de communiquer la sortie d'un programme (ou commande) l'entr e d'un autre programme (appel dans ce cas pr cis ltre (cf. 1.5.3). les chiers sp ciaux qui d signent les p riph riques ( cran, clavier, etc.) ; Cette organisation permet de g n raliser l'uitilisation des commandes, des appels syst me et des fonctions pr d nies, sp ci ques aux chiers normaux, aux autres types de chiers. Par exemple la fonction fprintf de la biblioth que standard C peut tre utilis e pour a cher sur l' cran ou crire dans un chier. Une commande de manipulation de chier porte sur le chier (dans le sens large du terme) lui-m me ou sur ses contenus. Une m me commande peut op rer des deux fa ons selon son contexte d'utilisation. Par exemple la commande ls (cf. 1.4.4) lorsqu'elle est appliqu e un r pertoire a che des information sur le r pertoire lui-m me (option -d) ou sur ses contenus (d faut). Unix fournit un nombre tr s important de commandes et d'utilitaires. Le meilleur moyen pour les d couvrir est de r cup rer des script s (programmes shell (cf. 1.6)), et la meilleure r f rence est la documentation en ligne (commande man). Le tableau 1.2 donne un bref aper u de quelques commandes parmi les plus utilis es et pouvant servir de r f rences lorsqu'on cherche accomplir une op ration donn e 5. Apr s quelques exemples, nous d taillerons les commandes ls (cf. 1.4.4) et chmod (cf. 1.4.4). titre d'exemple de commandes relativement complexes, on d crit les deux commandes find (cf. 1.4.5) et tar (cf. 1.4.6). Puis, apr s avoir pr sent les expressions r guli res, nous tudierons la commande egrep (cf. 1.5.2) titre d'exemple des commandes sp ci ques aux chiers texte.

1.4.2 Fichiers et types de chiers

1.4.3 Commandes de manipulation de chiers

Exemples1 2 3 4 5 6 7 8

~/pub>ls BDU ExemplesCours ~/pub>ls -ilR total 8 667524 drwxr-xr-x 2 alissali cuc 667315 drwxr-xr-x 2 alissali cuc ./BDU: total 74

1024 Dec 11 15:51 BDU 1536 Dec 11 15:36 ExemplesCours

5. La rubrique See also de la documentation en ligne sert d'index crois permettant de trouver de nouvelles commandes partir de celles que l'on connait.Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

1.4 Notion de syst me de chiers

13

Commande

Description Options Commandes pour tout type de chier ( chiers normaux, r pertoires, etc.) ls chier] (LiSt) A cher des inforamtions sur le chier ou sur ses contenus. chmod mode chier (CHange MODe) Changer le mode d'acc s (les protections) du chier. find r pertoire crit res Rechercher, selon les crit res, des chiers partir du r pertoire sp ci . tar op rations archive E ectuer les op rations sp ci es (cr ation, consultation, extraction) sur archive. ln source destination (LiNk) Cr er un lien (nom) pour un chier existant. rm nom (ReMove) Supprimer un lien, -r (R cursif) supprimer un r pertoire et tous ses contenus. mv source destination (MoVe) D placer ou change le nom d'un chier/r pertoire. cp source destination (CoPy) Faire une copie destination de source, -r (R cursif) Copier tout une arborescence (un r pertoire). Commandes sp ci ques aux r pertoires pwd (Print Working Directory) A cher le r pertoire courant. cd nom (Change Directory) Changer de r pertoire courant. sans argument] le r petoire courant devient HOME (r pertoire racine de l'utilisateur). mkdir nom (MaKe DIRectory) Cr er un r pertoire. rmdir nom (ReMove DIRectory) Supprimer un r pertoire, il doit tre vide. Commandes sp ci ques aux chiers cat nom (CATenate) A cher le contenu d'un chier (clavier entr e standard par d faut). more nom A cher le contenu page par page. wc (Word Count) Compter les caract res, les mots et les lignes. cmp A cher les num ros de ligne et d'octet o 2 chiers di rent. comm S lectionner ou rejetter les lignes communes deux chiers. diff A cher ligne par ligne les di rences entre deux chiers. sort Trier par ligne un ou plusieurs chiers (avec fusion dans ce dernier cas). -u (Unique) Supprimer les duplications. cut S lectionner des champs dans les lignes d'un chier. paste Concat ner les lignes de deux chiers.Tab.

1.2 Quelques commandes de manipulation de chiers sous

Unix

.

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

149 10 11 12 13 14 15 16 17 18 19 20 21 22

Chapitre 1 Introductioncuc cuc cuc 804 Dec 11 15:49 00LISEZ.MOI 2370 Dec 11 15:51 Makefile 1092 Dec 10 18:01 dates.c

Unix

3532166 -rw-r--r-1 alissali 1066443 -rw-r--r-1 alissali 2265946 -rw-r--r-1 alissali ...] ./ExemplesCours: total 269 1999384 -rw-r--r-1 alissali 1399970 -rw-rw-rw1 alissali 1999392 -rwxr-xr-x 1 alissali ...] ~/pub>ls ExemplesCours/*.c ExemplesCours/affiche.c ExemplesCours/explMdfParFct.c ...]

cuc cuc cuc

1668 Nov 25 14:33 Makefile 177 Nov 25 14:12 affiche.c 14528 Nov 25 14:12 rechDichTest

ExemplesCours/saisieInverse.c ExemplesCours/saisieInverse_test.c

Cette commande permet d'a cher des informations sur les chiers et les r pertoires en se r f rant la table des i-nodes lorsque n cessaire :argi : liste optionnelle de noms de chiers et de r pertoires. Pour chaque r pertoire argi a che la liste des chiers qu'il contient. Pour chaque chier argj a che des informations sur le chier. Sans argument : a che la liste des chiers du r pertoire courant. Les informations a ch es et leur format d pendent des options. ls -RadLCxmlnogrtucpFbqisf1%] arg1...argn

1.4.4 La commande ls

Quelques optionssi aucune option n'est pr sente a che uniquement les noms ; -l : liste longue, a che la plupart des informations du i-node ; -i : a chage des noms et des num ros d'i-nodes correspondants ; -R : a chage r cursif (exploration des sous-r pertoires). La liste longue a la forme suivante :-rw-r r 1 alissali cuc 804 Dec 11 15:49 00LISEZ.MOI

autres utilisateurs. Le deuxi me champ a che le nombre de liens du chier. Dans le troisi me et le quatri me champs on trouve respectivement le nom du propri taire du chier et celui de son groupe. Les champs suivants d crivent respectivement la taille (en octets), la date et l'heure de la derni re modi cation et le nom du chier.

Le premier champ d crit le type du chier ( `-': chier normal, `d' r pertoire, etc.) et les droits d'acc s (r : lecture, w : criture, x : ex cution) pour, successivement, le propri taire, son groupe et les

La commande chmodchmod ugoa ]{ +

Permet de modi er lemode ou droits d'acc s (les protections) pour le(s) chier(s) sp ci (s).

j

-

j

= }

rwxlsStTugo] rg1 arg2 ... argn

Exemples1 2 3 4 5 6 7 8

~/pub/ExemplesCours>ls -l rechDichTest -rwxr-xr-x 1 alissali cuc 14528 Nov 25 14:12 rechDichTest ~/pub/ExemplesCours>chmod u-x rechDichTest ~/pub/ExemplesCours>ls -l rechDichTest -rw-r-xr-x 1 alissali cuc 14528 Nov 25 14:12 rechDichTest ~/pub/ExemplesCours>rechDichTest rechDichTest: Command not found. ~/pub/ExemplesCours>./rechDichTest

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

1.4 Notion de syst me de chiers9 10 11 12 13 14

15

./rechDichTest: Permission denied. ~/pub/ExemplesCours>chmod g+w rechDichTest ~/pub/ExemplesCours>ls -l rechDichTest -rw-rwxr-x 1 alissali cuc 14528 Nov 25 14:12 rechDichTest ~/pub/ExemplesCours>chmod u-w rechDichTest ~/pub/ExemplesCours>rm rechDichTest

La derni re op ration, ligne 14, se d roule normalement malgr la protection en criture du chier. En e et celle-ci n'emp che pas la suppression d'un chier car il s'agit d'une modi cation sur le r pertoire. Si on prot ge le r pertoire en criture la suppression n'est plus possible :1 2 3 4 5

~/pub/ExemplesCours>ls rechDichTest UX:ls: ERROR: Cannot access rechDichTest: No such file or directory ~/pub/ExemplesCours>chmod u-w . ~/pub/ExemplesCours>rm rechDichTest.o UX:rm: ERROR: rechDichTest.o not removed: Permission denied.

1.4.5 La commande findfind liste-chemins-d-acces expBool

Pour chaque chemin d'acc s dans liste-chemins-d-acces, rechercher les chiers qui v ri ent l'expression bool enne expBool. Cette expression est construite de primitives pr d nies (cf. man page) reli es par les op rateurs logiques de base (la juxtaposition joue le r le du et logique, le `!' celui de la n gation et (-o) celui du ou logique).

Exemple1

find $HOME \backslash{}( -name a.out -o -name '*.o' \backslash{}) -atime +7 -exec rm {} \backslash{};

Recherche partir du r pertoire racine personnel ($HOME) tous les chiers dont le nom est a.out ou (tous les chiers objets), et les supprime s'ils n'ont pas t utilis s depuis plus de 7 jours. On note que les caract res susceptibles d' tre interpr t s par le shell (les parenth ses, `*' et `;') sont prot g s (pr c d par le caract re sp cial (cf. 1.2.3) \ ce qui emp che leur interpr tation .*.o

1.4.6 La commande tartar clef options fichierArchive tar (Tape ARchiver ) permet de manipuler des archives de chiers. l'origine il a t con u pour l'archivage sur bande magn tique. Aujourd'hui il sert particuli rement pour les transferts sur r seau. clef d termine la fonction ex cut e par tar, les plus utilis es sont : c (Cr er), t (a cher la lisTe) et x (eXtraire).

ExemplePour cr er une archive qui contient les sources (.c et .h) du r pertoire courant :1

tar cvf archive *.c *.h

Apr s un ventuel transfert, les deux commandes suivantes permettent respectivement de visualiser la liste de contenus et d'extraire les chiers de l'archive :1 2

tar tvf archive tar xvf archive

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

16

Chapitre 1 Introduction

Unix

1.5 Fichiers texte

Un chier texte est un chier de caract res d coup en lignes. Une ligne est une suite de caract res termin e par le caract re \n (retour chariot). Par exemple tout programme source en langage C (.c) est un chier texte. Par contre les chiers produits par le compilateur (comme les .o) ou par l' diteur de lien (tel que a.out) ne sont pas des chiers texte. Gr ce cette distinction, les chiers texte supportent des traitements sp ci ques. Par exemple la plupart des commandes sp ci ques aux chiers dans le tableau 1.2 ne s'appliquent qu' ce type de chiers. Une expression r guli re (ER) sp ci e un ensemble de cha nes de caract res. On dit d'un l ment d crit par une expression r guli re qu'il est d sign ou mis en correspondance (matched ) par l'ER. Dans une expression r guli re certains caract res ont un sens sp cial, les autres d signent le caract re lui-m me.

1.5.1 Les Expressions R guli res

Expressions r guli res un seul caract re

Les ER suivantes d signent un seul caract re : Un caract re normal (par contraste aux caract res sp ciaux discut s ci-apr s) est une ER un seul caract re qui d signe le caract re lui-m me. Un backslash (\) suivi par un caract re sp cial est une ER d'un seul caract re qui d signe le caract re sp cial lui-m me. Les caract res sp ciaux sont : ., *, , et \ sont toujours sp ciaux sauf quand ils appartiennent un ensemble (c. .d. quand ils paraissent entre crochets ( ]), voir ci-apr s) ^ (accent circon exe), qui a un sens sp ci que en d but d'ER (voir ci-dessous), ou quand il suit imm diatement le crochet gauche d'une paire de crochets ( ]) (voir ci-dessous). $ est sp cial en n d'ER (voir ci-dessous). Le caract re utilis pour d limiter une ER enti re est sp cial pour cette ER. Par exemple `/' est un caract re sp cial lorsque est utilis pour d limiter des ER dans les commandes de substitution de texte sous ed et sed. un point `.' est une ER un seul caract re qui d signe n'importe quel caract re sauf nouvelle-ligne (ou retour-chariot ). Une cha ne de caract res non vide incluse entre crochets est une ER un seul caract re qui d signe un seul l ment de la cha ne consid r e comme un ensemble. De plus : Le symbole `^' en d but de cha ne d signe le compl ment de l'ensemble des caract res du reste de la cha ne : le caract re d sign est n'importe quel caract re (hormis nouvelle-ligne ) n'appartenant pas la cha ne. Le signe moins `-' peut tre utilis pour d signer un intervalle de valeurs ; par exemple 0-9] est quivalent 0123456789]. Pour inclure un des deux caract res `-' ou (]) dans l'ensemble, ce caract re doit tre le premier de la cha ne (apr s un ventuel `^'). `-' peut aussi tre le dernier caract re de la cha ne.

Construction d'expressions r guli res

Les r gles suivantes expliquent comment construire des ERs partir d'ERs un seul caract re : Une ER un seul caract re d signe ce que d signe le caract re. Une ER un seul caract re suivie d'un asterisk `*' est une expression r guli re qui d signe 0 ou plus occurrence de l'ER. En cas d'ambigu t c'est la cha ne la plus longue qui sera prise en compte. Une ER un seul caract re suivie de \{m\}, (resp. \{m,\}, resp. \{m,n\}) est une expression r guli re qui d signe m (resp. m ou plus, resp. m n) occurrences de l'ER un seul caract re. m et n doivent tre compris entre 0 et 256. En cas d'ambigu t c'est la cha ne la plus longue qui sera prise en compte.c M. Alissali, Universit du Maine 1998

Introduction l'algorithmique en C/Unix

1.5 Fichiers texte

17

La concat nation de deux ERs d signe les cha nes constitu es de la concat nation des cha nes d sign es par les deux ERs. Une ER peut tre entour e de \( et \) ; les cha nes d sign es restent les m mes. L'expression \n d signe la m me cha ne de caract res que celle incluse entre la ne paire de \( et \) compter de la gauche. Par exemple ^\(.*\)\1$ d signe une ligne enti re compos e de deux occurrences d'une m me cha ne. Une ER peut tre contrainte d signer des mots : \< contraint une ER d signer un d but de cha ne (constitu e de lettres, chi res et sous-tirets). \> contraint une ER d signer une n de cha ne. Une ER peut tre contrainte d signer un segment initial et/ou un segment nal d'une ligne : Un accent circon exe `^' en d but d'ER la contraint d signer un segment initial d'une ligne. Un `$' en n d'ER la contraint d signer un segment nal d'une ligne. La construction ^ER$ contraint l'ER d signer une ligne enti re. L'ER nulle (par exemple //) est quivalente la derni re expression r guli re rencontr e.

Contraindre les ER

1.5.2 La commande egrepegrep a che l' cran toutes les lignes de fichier qui contiennent une cha ne d sign e par patron. Cette commande accepte les expressions r guli res l'exception de \( et \), et avec les ajouts suivants : Une ER suivie de + d signe une ou plus occurrence de l'ER. Une ER r guli re suivie de ? d signe 0 ou 1 occurrence de l'ER. La barre verticale | et nouvelle-ligne jouent le r le de ou entre deux ERs. Les parenth ses peuvent tre utilis es pour grouper. Il faut faire attention aux caract res qui ont un sens particulier pour les shells, en particulier : $, *, , , |, (, ) et \ . Il vaut mieux entourer toute l'ER par des apostrophes '...' pour viter toute interpr tation par le shell. L'ordre de pr c dence des op rateurs est le suivant : ], * ? +, la concat nation puis le ou. Selon l'implantation egrep accepte des simpli cation d' criture en d nissant des classes de caract res . Par exemple :alnum:] d signe la classe de tout les caract res alpha-num riques. egrep -bchilnsv] patron] fichier...]

Exemples1 2 3

Extraction des directives du pr processeur (distingu e par #) :

Cmd 1 >egrep '#' etudiant.c #include #include"etudiant.h" /* inclut personne.h */

Extraction des commentaires, premier essai :1 2 3 4 5 6 7 8 9

Cmd 2 >egrep '\*' etudiant.c /* Fichier : etudiant.c * Description : module de traitement d'un enregistrement typeEtudiant. ... */ #include"etudiant.h" /* inclut personne.h */ /************** * afficheEtudiant : affichage d'un ernregistrement de typeEtudiant. ...

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

1810 11 12

Chapitre 1 Introduction

Unix

*/ saisiePersonne (&((*ptrEt).pers)); scanf("%d", &((*ptrEt).id));

ce n'est pas su sant car certaines lignes contiennent des `*' sans tre des commentaires. Extraction des dates (n'importe quel chi re) :1 2

Cmd 3 >egrep ' 0-9]' etudiant.c * Historique : 10.12.96 : r alisation, test OK.

Extraction des commentaires, deuxi me essai :1 2 3 4 5

Cmd 4 >egrep '/\*' etudiant.c /* Fichier : etudiant.c #include"etudiant.h" /* inclut personne.h */ /************** /**************

Toutes les lignes de commentaire n'ont pas la s quence d signe (espace) ou / avant l'ast risk :1 2 3 4 5 6 7

/*

. Un meilleur r sultat est obtenu si on

Cmd 5 >egrep ' /]\*' etudiant.c /* Fichier : etudiant.c * Description : module de traitement d'un enregistrement typeEtudiant. ... */ #include"etudiant.h" /* inclut personne.h */ ...

Extraction des dates, la version suivante (une date est une succession de chi res et de `.') :1

Cmd 6 >egrep ' 0-9.]*' etudiant.c

est inad quate car elle comprend z ro r p tition : toutes les lignes seront s lectionn es. Il faut donc forcer une occurence au moins :1

Cmd 7 >egrep ' 0-9.] 0-9.]*' etudiant.c

ou sa simpli cation (autoris e par egrep) :1

Cmd 8 >egrep ' 0-9.]+' etudiant.c

s lectionne toutes les lignes avec au moins un `.' ou un chi re, y compris celle qui contiennent des cha nes comme .5 ou 3.14195 . Pour viter une telle confusion, le cas ch ant, la description, plus complexe et plus compl te, doit d signer clairement la forme exacte d'une date ; trois suites de 2 chi res s par es par des `.' :1

Cmd 9 >egrep ' 0-9] 0-9]\. 0-9] 0-9]\. 0-9] 0-9]' etudiant.c

Pour extraire les lignes de description (qui commencent par1 2 3 4 5

/*

ou

*

):

Cmd 10 >egrep '^ /]\*' etudiant.c /* Fichier : etudiant.c * Description : module de traitement d'un enregistrement typeEtudiant. ... */

et pour extraire les lignes qui se terminent par un commentaire ( ventuellement suivi d'espaces) :1 2 3 4

Cmd 11 >egrep '\*/ *$' etudiant.c */ #include"etudiant.h" /* inclut personne.h */ ...

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

1.5 Fichiers texte

19

Si on ne d sire pas les lignes qui contiennent */ uniquement, l'expression suivante est insu sante car elle exclut compl tement les espaces :1

Cmd 12 >egrep '^ ^ ]+\*/ *$' etudiant.c

par contre :1 2

Cmd 13 >egrep '^.* ^ ]+.*\*/ *$' etudiant.c #include"etudiant.h" /* inclut personne.h */

veut dire : une ligne o

quelque part il y a quelque chose autre que (espace).

Un ltre est un programme (commande ou encore utilitaire) Unix qui lit une entr e, qui sera consid r comme un ot compos de lignes de caract res et r alise une ou plusieurs transformations sur chaque ligne pour produire un r sultat. Pour un ltre l'entr e provient d'un chier qui est, par d faut, l'entr e standard (le clavier). De m me le r sultat est crit sur un chier qui est, par d faut, la sortie standard (l' cran). Dans le cas g n ral (cf. g. 1.2) les transformations d pendent des instructions et sont contr l es par des options.Instructions fichier ou ligne de commande

1.5.3 Les ltres

Entre par defaut entre standard (clavier)

Filtre commande ou utilitaire

Sortie par dfaut sortie standard (cran)

OptionsFig.

1.2 Pr sentation g n rale d'un ltre

Unix

.

Parmi les commandes qui jouent le r le de ltres citons : grep (dont egrep (cf. 1.5.2) est une variante), (a chage d'une partie d'un chier), sort, wc, tr (traduction de caract res), sed ( diteur de texte non interactif) et awk qui supporte un v ritable langage de programmation, proche du C, pour la manipulation des chiers texte.tail

Entre 1 Entre standard

Sortie1 Filtre 1 Entre du tubeFig.

Entre2 Filtre2 Tube Sortie du tubeUnix

Sortie 2 Sortie Standard

1.3 Utilisation des tubes avec les ltres

.

Les ltres sont particuli rement int ressants lorsqu'ils sont encha n s l'aide de tube s. La gure 1.3 sch matise la commande compos e : filtre1 | filtre2 Par exemple : ls | wc -w compte le nombre de chiers dans le r pertoire courant (l'option -w (Words ) sp ci e le comptage de mots uniquement). Notons que, dans ce cas-l la premi re commande (ls) n'est pas un ltre ce qui ne change rien au fonctionnement du tube.Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

20

Chapitre 1 Introduction

Unix

La commande cat

La commande cat est un cas typique des ltres. Comme on peut le voir dans la version simpli e propos dans ce document (cf. 2.4.3), son fonctionnement de base est tr s simple : sans arguments il a che l' cran (sortie standard) ce qui est saisi au clavier (entr e standard). Avec un ou plusieurs arguments, il a che les contenus des chiers l' cran.cat -nbsuvet ] fichier...]

Quelques optionsPr c der chaque ligne par son num ro. -b Pareil que le pr c dent mais ne pas num roter les lignes blanches (vides). -v A cher un code pour les caract res non imprimables. L'exercice suivant illustre quelques unes des utilisations possibles de cette commande.-n

Exercice

Sachant que le caract re D (ctrl-D) signi e la s quence de commandes qui suit.

n de saisie lors d'une saisie au clavier, commenter

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

set prompt = 'Cmd. no. ! > ' Cmd. no. 2 > mkdir Annuaire Cmd. no. 3 > cd Annuaire Cmd. no. 4 > ls -l total 0 Cmd. no. 5 > cat > an1 Dupond 0123456 ^D Cmd. no. 6 > cat an1 Dupond 0123456 Cmd. no. 7 > cat > an2 Durans d 9876549 Martin 1111222 Bertrand 9998887 ^D Cmd. no. 8 > cat an1 Dupond 0123456 Cmd. no. 9 > cat an1 Meyer 55544433 ^D Cmd. no. 10 > cat an* > an cat: input/output files 'an' identical Cmd. no. 11 > cat an Dupond 0123456 Meyer 5554433 Durand 9876549 Martin 1111222 Bertrand 9998887 Cmd. no. 12 > sort an Bertrand 9998887 Dupond 0123456 Durand 9876549 Martin 1111222 Meyer 5554433 Cmd. no. 13 > sort an1 an2 > anTrie Cmd. no. 14 > cd .. Cmd. no. 15 > rmdir Annuaire rmdir: directory "Annuaire": Directory not empty Cmd. no. 16 > rm -r Annuaire

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

1.6 La programmation en C-Shell

21

Un shell script est un chier texte qui contient une suite de commandes, dont certaines (parmi les commandes internes) jouent le r le de contr le de ot d'ex cution. Dans le cas du C-Shell ces derni res ainsi que la forme des expressions autoris es sont largement inspir es du langage C d'o le nom de cet interpr te. L'exemple suivant montre un petit script C Shell qui servira d'exemple par la suite. Ce script recherche, l'aide de la commande egrep, une liste de mots dans les chiers d'un ensemble de r pertoires pr d nis. 1 #! / bin / csh 2 set r e p e r t o ir e s = ( $HOME/ Annuaire ~ a l i s s a l i / lo c a l / Annuaire ) 3 foreach rep ( $ r e p e r t o ir e s ) 4 cd $rep 5 echo Recherche dans le r e p e r t o ir e :a : $rep 6 foreach mot ( $ ) 7 foreach f ic h ie r ( ) 8 if ( ( f $ f i c h ie r ) && ( r $ f i c h i e r ) ) then 9 ( f i l e $ f i c h i e r j / usr /xpg4 / bin / grep Fq " text ") 10 if ( $status == 0 ) then 11 echo Recherche dans le f ic h ie r :a : $ f i c h i e r 12 grep $mot $ f i c h i e r 13 if ( $status != 0 ) echo Aucune correspondance dans ce f ic h ie r !

1.6 La programmation en C-Shell

endif endif 16 end 17 end 18 end14 15

Avant l'ex cution d'une commande, le C-Shell constitue les cha nes de caract res et les noms des chier en interpr tant certains caract res (un sous-ensemble des expressions r guli res). En plus de `?' et `*' d crits dans l'introduction au C Shell (cf. 1.3), les formes suivantes sont interpr t es : ...] a la m me signi cation que dans les expressions r guli res ;{ ch1, ch2, ... } utilisateur1 2 3 4 5 6 7 8 9

1.6.1 Substitution de nom de chier

a le m me sens que le pr c dent sauf que le r sultat n'est pas tri ;

se r f re au r pertoire racine de utilisateur.

cmd 1 >ls tabEtudiantsV?.c tabEtudiantsV0.c tabEtudiantsV2.c tabEtudiantsV4.c tabEtudiantsV1.c tabEtudiantsV3.c cmd 2 >echo tabEtudiantsV 432].c tabEtudiantsV2.c tabEtudiantsV3.c tabEtudiantsV4.c cmd 3 >echo tabEtudiantsV{4,3,2}.c tabEtudiantsV4.c tabEtudiantsV3.c tabEtudiantsV2.c cmd 4 >ls ~alissali Makefile app-defaults tmp

Dans le script de l'exemple : ~alissali d signe le r pertoire racine de l'utilisateur alissali, la variable d'environnement pr d nie HOME contient la m me valeur. L'expression de la boucle interne foreach sera remplac e par la liste des noms de tous les chiers du r pertoire courant. Une variable interne du C-Shell est constitu e d'un nom et d'une valeur. La valeur est une suite de mots (z ro ou plus) s par s par des espaces. Une variable est d nie (et ventuellement initialis e) par la commande interne :set var = valeur ] ]

1.6.2 Variables internes du C Shell

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

22

Chapitre 1 Introduction

Unix

Si valeur est compos e de plusieurs mots elle doit tre d limit e par des parenth ses. La valeur peut tre le r sultat de l'expansion de nom de chier ou d'une commande, dans ce dernier cas la commande doit tre d limit par des guillemets simples (' '). Le script annuRech.csh utilise la commande set une seule fois ; pour d nir la variable repertoires et l'initialiser la liste des r pertoires o on veut e ectuer la recherche. La forme : remplace le mot num ro n de var par nouveauMot. $var et ${var} permettent de r cup rer la valeur de var. $var ind] et ${var ind]}, o ind est un entier strictement positif, se r f rent au mot d'indice ind. ind peut aussi d signer un intervalle. $#var et ${#var} donnent le nombre de mots dans var. La commande :unset pattern set var n] = nouveauMot

permet de supprimer toutes les variables dont le nom est mis en correspondance (d'apr s les r gles de substitution de nom de chier) avec pattern.

Exemples1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

(alissali@lola) ~>csh (alissali@%m) %~>set prompt = 'cmd ! >' cmd 2 >set message = (C-shell est un interprete de commandes) cmd 3 >echo $message C-shell est un interprete de commandes cmd 4 >set message 3] = mon cmd 5 >echo $message C-shell est mon interprete de commandes cmd 6 >echo $message -3] C-shell est mon cmd 7 >echo $message 4-6] interprete de commandes cmd 8 >set fichPers = pers* cmd 9 >echo $fichPers personne.c personne.h personneTest.c cmd 10 >set fichEtd = `ls etu*` cmd 11 >echo $fichEtd etudiant.c etudiant.h etudiantTest.c cmd 12 >echo $#fichEtd 3 cmd 13 >echo $#message 6 cmd 14 >unset mes* cmd 15 >echo $message message: Undefined variable.

1.6.3 Rappel de commande et modi cateurs de mots

Le C-Shell maintient une liste des derni res commandes ex cut es. La taille de cette liste est d termin e par la valeur de la variable history, la commande du m me nom, history, permet d'a cher cette liste. Un rappel de commande commence par le caract re !, le(s) caract re(s) qui suivent celui-ci d terminent comment la commande sera rappel e : !! : rappelle la derni re commande ; !n : rappelle la commande num ro n ; !chaine : rappelle la commande la plus r cente qui commence par chaine ; !?chaine? rappelle la commande la plus r cente qui contient chaine ;c M. Alissali, Universit du Maine 1998

Introduction l'algorithmique en C/Unix

1.6 La programmation en C-Shell!{chaine1}chaine2

23

rappelle la commande la plus r cente qui contient chaine, y ajouter chaine2. Lors d'un rappel de commande, on peut e ectuer des modi cations l'aide de l'op rateur : sur une variable ou un nom de chier. Un modi cateur permet de d terminer la modi cation e ectuer, le tableau 1.3 r sume les modi cateurs les plus int ressants.Modificateur r e s/l/r/ & g p

Signi cation Supprimer un su xe de la forme `.xxx', laissant le nom sans extension. Supprimer tout sauf le su xe, laissant l'extension. Substituer la cha ne `l'par la cha ne `r'. R p ter la derni re substitution. modi cation g n rale (toute occurrence), pr xe un autre modi cateur (p.e. gr). imprimer la nouvelle commande sans l'ex cuter. 1.3 Modi cateurs de rappel de commande et de nom de chier

Tab.

Sauf s'il est pr c d de `g' un modi cateur est appliqu une seule fois. Les modi cateurs sont particuli rement utiles dans les rappels de commandes (op rateur !!) et lorsqu'ils sont appliqu s des noms de chiers.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

(alissali@lola) ~>csh (alissali@%m) %~>set prompt = 'Cmd ! >' Cmd 2 >history Cmd 3 >set history=15 Cmd 4 >history 3 set history=15 4 history Cmd 5 >pwd /export/home/ens/cuc/alissali Cmd 6 >cd pub/BDU Cmd 7 >!p pwd /export/home/ens/cuc/alissali/pub/BDU Cmd 8 >!4 history 3 set history=15 4 history 5 pwd 6 cd pub/BDU 7 pwd 8 history Cmd 9 >ls -l etudiant.c -rw-r--r-1 alissali cuc 298 Cmd 11 >set fichier="etudiant.c" Cmd 12 >ls -l $fichier:r UX:ls: ERROR: Cannot access etudiant: No Cmd 13 >ls -l $fichier:r.h -rw-r--r-1 alissali cuc 240 Cmd 15 >!ls:p ls $fichier:r.h Cmd 16 >ls -l etudiant.c -rw-r--r-1 alissali cuc 298 Cmd 18 >ls -l etu*.? -rw-r--r-1 alissali cuc 298 -rw-r--r-1 alissali cuc 240 -rw-r--r-1 alissali cuc 110 Cmd 19 >!!:s/etu/date/ ls -l date*.? -rw-r--r-1 alissali cuc 1092 -rw-r--r-1 alissali cuc 127 -rw-r--r-1 alissali cuc 92 Cmd 20 >ls -l etudiant.c etudiant.h

Dec 10 18:01 etudiant.c

such file or directory Dec 10 18:23 etudiant.h

Dec 10 18:01 etudiant.c Dec 10 18:01 etudiant.c Dec 10 18:23 etudiant.h Dec 10 18:01 etudiantTest.c

Dec 10 18:01 dates.c Dec 3 18:48 dates.h Dec 10 18:01 datesTest.c

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

2443 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Chapitre 1 Introduction298 Dec 10 18:01 etudiant.c 240 Dec 10 18:23 etudiant.h

Unix

-rw-r--r-1 alissali cuc -rw-r--r-1 alissali cuc Cmd 21 >!!:s/etudiant/dates/ ls -l dates.c etudiant.h -rw-r--r-1 alissali cuc -rw-r--r-1 alissali cuc Cmd 22 >!!:& ls -l dates.c dates.h -rw-r--r-1 alissali cuc -rw-r--r-1 alissali cuc Cmd 23 >!20:gs/etudiant/dates/ ls -l dates.c dates.h -rw-r--r-1 alissali cuc -rw-r--r-1 alissali cuc

1092 Dec 10 18:01 dates.c 240 Dec 10 18:23 etudiant.h

1092 Dec 10 18:01 dates.c 127 Dec 3 18:48 dates.h

1092 Dec 10 18:01 dates.c 127 Dec 3 18:48 dates.h

le tableau 1.4 pr sente quelques expressions sur les variables particuli rement int ressantes pour les scripts C-Shell.$< $?var ${?var} $n ${n} $argv n] $* $argv *]

expression remplac e par une ligne de l'entr e standard (le clavier). une expression qui vaut 1 si var est d ni, 0 sinon. Trois expressions quivalentes. D signent le ne argument (param tre) de l'appel du script. L'argument d'indice 0 est le nom du chier qui contient le script. Deux expressions quivalentes. D signen tous les arguments (param tres) du script. 1.4 Expressions sp ci ques sur les varaibles en C Shell

Tab.

Certaines commandes internes du C-Shell (cf. par exemple le tableau 1.7) acceptent des expressions qui utilisent des op rateurs semblables ceux du langage C et ont la m me pr c dence (ordre de priorit ). Typiquement les expressions paraissent dans les commandes @, exit, if, set et while. Les valeurs nulles ou manquantes sont remplac es par 0. Le r sultat d'une expression est une cha ne de caract res qui peut repr senter un nombre (apr s conversion, explicite ou implicite selon le cas). Le tableau 1.5 pr sente les op rateurs du C Shell dans leur ordre de pr c dence.Op rateur (...) ! * / % + < > = == != = ! & | && ||

1.6.4 Expressions et op rateurs

Op ration groupement (force les priorit s) compl ment 1 (n gation logique bit- -bit) n gation logique multiplication, division et reste addition et soustraction d calage gauche, d calage droite inf rieur, sup rieur, inf rieur ou gale, sup rieur ou gale gale, di rent, d signation ou non d'un nom de chier (cf. commentaire ci-apr s) ET bit- -bit OU exclusif bit- -bit OU bit- -bit ET logique OU logiqueTab.

1.5 Op rateurs du C Shell

Contrairement au langage C, les op rateurs de comparaison comparent des cha nes de caract res, les autres op rateurs traitent leurs arguments comme des nombres. L'op rateur = (resp. ! ) v ri e si son premier argument ( gauche) correspond (resp. ne correspond pas) un nom de chier d sign par son deuxi me argument ( droite).Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

1.6 La programmation en C-Shellstatus

25

Dans annuRech.csh les op rateurs == et != sont utilis s pour tester la valeur de la variable pr d nie . La valeur de cette variable est automatiquement mise jour par le C shell pour indiquer l' tat de terminaison (c. .d. la valeur de retour) de la derni re commande ex cut e (voir par exemple la commande exit dans le tableau 1.8 ci-apr s). Les expressions du tableau 1.6 e ectuent des tests sur chiers . Chaque expression retourne true (ou 1) si elle est v ri e, false (ou 0) sinon.Test -r nomFichier -w nomFichier -x nomFichier -e -o -z -f -d nomFichier nomFichier nomFichier nomFichier nomFichierTab.

Valeur vraie si... le chier est accessible en lecture. le chier est accessible en criture. le chier est accessible en ex cution (ou en recherche pour un r pertoire). nomFichier exists. nomFichier appartient l'utilisateur. nomFichier est vide (taille 0). nomFichier est un chier ordinaire. nomFichier est un r pertoire.

1.6 Tests sur les chiers en C Shell Si nomFichier n'existe pas ou est inaccessible tous ces tests retournent false. Le premier if dans annuRech.csh teste si la valeur de la variable fichier est un nom de chier ordinaire accessible en lecture. Les deux tableaux suivants r sument les commandes internes les plus importantes du C Shell : les commandes de contr le d'ex cution sont group es dans le tableau 1.7, et les autres commandes dans le tableau 1.8. Quelques restrictions syntaxiques s'appliquent aux commandes du tableau 1.7, en particulier chaque occurrence de foreach, while et end doit para tre seule (ou avec expr le cas ch ant) sur sa ligne. Chaque occurrence de if...then, else et switch, doit tre le premier mot (hormis les espaces blancs) sur sa ligne. Le script annuRech.csh recherche une liste de mots, donn s en param tres l'appel du script, dans les chiers textes des r pertoires d sign s par la variable repertoires, d nie et initialis e en d but du script. La boucle foreach est utilis e trois fois : rep prend les valeurs successives de la liste des r pertoires (variable repertoires) ; mots prend les valeurs successives des param tres d'appel du script (expression $*, cf. tableau 1.4), ce sont les mots rechercher ; et fichier prend successivement tous les noms des chiers du r pertoire courant. On remarque que la commande grep est r f renc e de deux mani res di rentes : la premi re fois par un chemin d'acc s absolu et la deuxi me fois simplement par son nom. L'explication est qu'il peut y avoir plusieurs versions d'une m me commande (ce qui est habituellement indiqu es clairement dans la man page), l'utilisation du chemin d'acc s absolu permet d'imposer l'ex cution du programme (version) d sign au lieu de suivre le sch ma habituel de recherche de commande (cf. 1.3). tel est le cas pour le deuxi me appel de grep, et o la version utilis e d pend de la valeur de la variable path (cf. 1.6.2). la variable status est teste apr s chaque ex cution de grep ; une valeur di rente de 0 indique que la recherche a chou (cf. man page de grep). Apr s le deuxi me test, on a che un message d'erreur en cas d' chec, on pourrait aussi ajouter une commande exit mais dans ce cas-l il faut utiliser la commande if...then puisqu'il ne s'agit plus d'une commande simple. C'est le cas pour les deux autres tests qui portent chacun sur plusieurs commandes. Le premier teste si le chier existe et s'il est accessible en lecture. Le deuxi me teste la valeur de retour de la commande de la ligne pr c dente. Il s'agit d'une commande compos e l'aide d'un tube qui permet de v ri er que fichier est un chier texte. L'ensemble peut donc se lire : pour chaque rep de la liste repertoires, pour chaque mot de la liste d'arguments et pour chaque fichier (texte accessible en lecture) dans le r pertoire courant (rep apr s l'ex cution de cd), a cher les lignes qui contiennent le mot courant (commande grep).Introduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

1.6.5 Commandes internes (built-in )

1.6.6 Analyse du script annuRech.csh

26

Chapitre 1 Introduction

Unix

Commande if (expr) commande if (expr1) then ... else if (expr2) then ... else ... endif switch (chaine) case label: ... breaksw ... default: ... breaksw endsw while (expr) ... end foreach var (listeMots) ... end

Description commande est une commande simple, elle est ex cut e si expr est vraie. Une seule s quence de commandes, qui apparaissent la place des ... est ex cut e selon les valeurs des expri.if endif

doit tre seul sur sa ligne, ou suivre un else. et else doivent tre les premiers mots sur leurs lignes respectives.

Les labels sont des cha nes de caract res qui peuvent utiliser les m ta-caract res de nom de chier *, ? et ...]. L'ex cution commence au premier label qui se met en correspondace avec chaine et se termine par breaksw ou, d faut, par endsw. Si aucun label ne correspond chaine c'est la s quence qui suit default (s'il est pr sent) qui est ex cut e. Boucle tant que expr est vraie (valeur di rente de z ro) break et continue peuvent aussi tre utilis s pour terminer la boucle. Les commandes contenues dans le corps de la boucle sont ex cut es pour chaque mot de listeMots. La variable var prend pour valeur le mot courant pour chaque it ration. continue peut tre utilis pour interrompre l'it ration en cours break peut tre utilis pour terminer la boucle. R p te commande nombre fois. Les m mes restrictions que pour if s'appliquent. Continue (ou reprend) l'ex cution apr s label qui est une cha ne caract res laquelle s'appliquent les expansions de commande et de nom de chier. Continue l'ex cution apr s la boucle while ou foreach la plus proche. Les commandes restantes sur la m me ligne que break sont ex cut es. Continue l'ex cution avec la prochaine it ration de la boucle while ou foreach la plus proche.

repeat nombre commande goto label break continue

Tab.

1.7 Commandes interne de contr le du C Shell

Commande @ @ var =expr ] var n] =expr ]

cd dir ] chdir dir ] exit (expr) ] exec commande

Description A ectation du r sultat de l' valuation de expr (resp. au ne mot de) var. Dans expr, les op rateurs du tableau 1.5 sont autoris s, mais ceux susceptible d' tre interpr t s par le C-Shell (>, cc argProg.c Cmd. no. 67 > a.out Programme : a.out, nombre d'arguments : 1. Cmd. no. 68 > a.out arg1 arg2 bonjour bye Programme : a.out, nombre d'arguments : 5. argument no. 1 : arg1 argument no. 2 : arg2 argument no. 3 : bonjour

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

1.7 Processus9 10 11 12 13 14 15 16 17 18 19

29

argument no. 4 : bye Cmd. no. 69 > cc -o argProg argProg.c Cmd. no. 70 > argProg arg1 arg2 Programme : argProg, nombre d'arguments : 3. argument no. 1 : arg1 argument no. 2 : arg2 Cmd. no. 71 > ln argProg lienArgProg Cmd. no. 72 > lienArgProg bonjour bye Programme : lienArgProg, nombre d'arguments : 3. argument no. 1 : bonjour argument no. 2 : bye

Acc s aux variables d'environnement

Il existe des moyens (fonctions et variables globales), pour permettre un programme C d'acc der en lecture et/ou en modi cation l'environnement.

1.7.4 Processus et shell

Lorsqu'un shell ex cute une commande autre que les commandes internes, il cr e un nouveau processus dans lequel le programme correspondant la commande est ex cut e. Le ls peut ainsi acc der sa copie des variables d'environnement s'il en a besoin. Par exemple, la commande man acc de la variable d'environnement MANPATH pour r cup rer la liste des r pertoires dans lesquels sera e ectu e la recherche de la documentation (les man pages).

Exemple1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Cmd. no. 1 > setenv NOUVEAU "Variable d'environnement" Cmd. no. 2 > csh setenv ... MANPATH=/usr/man:/usr/local/man NOUVEAU=Variable d'environnement whereis ps ps: /usr/bin/ps /usr/ucb/ps /usr/man/man1/ps.1 /usr/man/man1b/ps.1b setenv MANPATH setenv ... MANPATH= man ps No manual entry for ps. exit Cmd. no. 3 > setenv ... MANPATH=/usr/man:/usr/local/man Cmd. no. 4 > man ps ...

La commande psps -af ... ]

1.7.5 Commandes de manipulation des processus-p proclist ] -u uidlist ] ...

Cette commande a che des informations sur les processus actifs. Par d faut elle a che un minimum d'informations sur le processus appelant et sur ses ls. Les options, dont une partie seulement gure ici, permettent de mieux g rer la sortie de la commande et son format.

Quelques options-a -f

a cher des informations sur tous les processus les plus fr quemment activ s. (emphFull) a chage complet.c M. Alissali, Universit du Maine 1998

Introduction l'algorithmique en C/Unix

30-p proclist -u uidlist

Chapitre 1 Introduction

Unix

a cher des informations sur les processus dont les PIDs sont donn s dans proclist. a cher des informations sur les processus dont les UIDs e ectifs sont donn s dans uidlist.

La commande killkill kill -l -signal ] pid...

La commande kill fait partie des commandes standards d'Unix, mais elle est aussi implant e (comme commande interne) par les di rents shells. Elle permet d'envoyer un signal un processus. Les signaux disponibles peuvent tre a ch s l' cran avec l'option -l. Un signal est identi par son nom ou par son num ro. Parmi les signaux les plus utilis s notons KILL, BUS et SEGV (respectivement num ros 9, 10 et 11). Le premier permet de tuer le processus num ro pid. Les deux autres sont souvent rencontr s lors d'une erreur d'ex cution de programme : dans ce cas-l un tel signal est envoy par le noyau pour tuer le processus en a chant un message (respectivement Bus error et Segmentation fault).

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

Chapitre 2

Le langage C2.1 Le langage C en bref (Rappels)Une variable est d nie par un triplet : nom, type (cf. 2.1.2) et valeur. Le nom et le type sont indispensables, ils sont fournis par une d nition de variable (et rappel s si n cessaire par une d claration). Une variable sert stocker et r cup rer des valeurs constantes (cf. 2.1.3) de son m me type. Le langage C n'impose pas d'attribuer une valeur une variable, mais une variable dont on ne fait pas varier la valeur ne sert pas grand-chose. La valeur d'une variable est initialement ind nie, elle peut varier au cours de l'ex cution : l'op rateur d'a ectation permet l'attribution d'une nouvelle valeur une variable. Une a ectation qui a lieu la d nition de la variable est appel e initialisation). L'utilisation (l'acc s ou la r f rence) permet de r cup rer sa valeur (par exemple dans la partie droite d'une a ectation). Le r sultat d'une r f rence une variable dont la valeur est ind nie est impr visible.

2.1.1 Variables

types simples

2.1.2 TypesUn type simple est d ni par le langage. Chaque type peut tre accompagn d'un ou plusieurs quali catifs de type qui en modi e la nature (taille, signe, type de stockage, etc.). Type mot-clef signe taille d faut entier int signed/unsigned short/long sign >= 16 bits r el float double/long double caract re char signed/unsigned 8 bits sign ou non

2.1 Types simples du langage C. Il n'existe pas de type bool en en C. Une expression bool enne (logique) est valu e en type entier, la valeur est trait e comme la valeur logique FAUX, toute autre valeur (di rentes de 0), elle est trait e comme la valeur logique VRAI.Tab.

Types compos s

Un type compos (tableau (cf. 2.3.1), enregistrement (cf. 2.3.3), etc.) est cr par le regroupement d' l ments de type simple ou compos . Les type compos s seront discut s plus en d tails plus loin (cf. 2.3.4).

2.1.3 Valeurs constantes

En langage C les constantes sont typ utilisation : de type entier : quali cation/type constante int 12234 long int 123456789L unsigned int 456U

es, on d duit le type d'une constante d'apr s sa forme ou son commentaire entier normal . une grande valeur (se termine par 'L'). un entier non sign (se termine par 'U'). 31

32

Chapitre2. Le langage C

de type caract re : constante description 'c' caract re normal . '\n' caract re sp cial (commence par \) ayant un sens sp ci que : ici le retour-chariot. '\013' caract re d ni par son code ASCII en octal (commence par \0). '\xb0f1' caract re d ni par son code ASCII en hexad cimal (commence par \x) Vu que la taille du stockage est ni, les valeurs num riques autoris es ont des limites inf rieure et sup rieure. Ces limites sont d pendantes du compilateur et peuvent donc varier d'une machine l'autre. Elles sont d nies dans les chiers limit.h et float.h (sous Unix normalement dans le r pertoire /usr/include). Les caract res sont cod s par des valeurs enti res et d nis par une table de codage (appel table ASCII ) qui d nit la correspondance caract re-code.

2.1.4 A ectation

Op rateur simple : = Op rateurs compos s : += -= *= /= etc. Exemple : a += b est quivalent a = a

+ b

Un op rateur permet d'e ectuer une op ration sur un type donn . Les op rations suivantes s'appliquent tous les types simples (y compris les caract res m me si cela peut para tre absurde). D'autres op rateurs ont des fonctions plus sp ci ques en fonction du type de donn e (l'indexage pour les tableaux, l'indirection pour les pointeurs, la s lection pour les enregistrements, etc.), ils seront pr sent s lorsque nous parlerons de ces constructions. Les op rateurs arithm tiques (+, *, -, /, ...) habituels sont reconnus du langage C. Cependant, puisqu'il s'agit d'un langage typ il faut bien noter que une division enti re, par exemple, est di rente d'une division r elle. Dans les expressions mixtes (entiers et r el par exemple), une conversion de type est op r e avant de d terminer le type de l'op ration.

2.1.5 Op rateurs

Arithm tiques

Comparaisons Logiques

Les op rateurs de comparaison sont : == != >= #include " id e n t it e . h" 9 10 int a f f ic h e Id ( const char message , int id )8 11 12 13 14 15 16 17 18 19 20

/ Fichier : i d e n t i t e . c Description : contient une seule fonction , a f f i c h a g e d ' un message d ' i d e n t i f i c a t i o n . Auteur : Mamoun ALISSALI Historique : Creation : Tue Feb 08 15 : 48 : 43 WET 1994 /

/

f

/

afficheIdimprimeMessage : imprime ses deux argument sur la s o r t i e standard . Entree : l e s arguments a imprimer : un tableau de char , et un int . Retour : TRUE si OK, FALSE sinon .

g / END a f f i c h e I d /

if ( f p r i n t f ( stdout , "%s : %dn n" , message , id ) < 0 ) return (FALSE) ; return (TRUE) ;

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

2.5 La compilation S par eprincipal.c1 2 3 4 5 6 7 8 9

49

#include < unistd . h> #include < sys / types . h> 11 #include < s t d lib . h> 12 #include < stdio . h> 13 #include " id e n t it e . h" 14 #include " p r in c ip a l . h" 15 16 int main( int argc , char argv ])10 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

/ Fichier : p r i n c i p a l . c Description : module p r i n i c i p a l de progC qui a f f i c h e d i v e r s e s i d e n t i f i c a t i o n s . progC sert d ' exemple a la creation d ' un programme C sous Unix . Auteur : Mamoun ALISSALI Historique : Creation . Tue Feb 08 15 : 40 : 52 WET 1994 A FAIRE : Completer traitement des erreurs . /

/

f

/

main : a p p e l l e a f f i c h e I d pour i d e n t i f i e r l ' u t i l i s a t e u r , son groupe , le processus courant et son pere . Retour : 0 si OK, 1 si erreur d ' imperssion , 10 argc i n c o r r e c t .

if ( argc != 1) f

g / END IF /

f p r i n t f ( stderr , " U t ilis a t io n : %s n n" , argv 0 ] ) ; exit ( 10 ) ;

f p r i n t f ( stdout , "Programme : %s n n" , argv 0 ]) ;

if if if if

(! (! (! (!

a f f ic h e Id ( " je suis l ' u t i l i s a t e u r " , getuid ( ) ) ) exit ( 1 ) ; a f f ic h e Id ( "mon groupe est " , getgid ( ) ) ) exit ( 1 ) ; a f f ic h e Id ( " je suis le processus " , getpid ( ) ) ) exit ( 1 ) ; a f f ic h e Id ( "mon pere est le processus " , getppid ( ) ) ) exit ( 1 ) ;

g / END main // __EOF__ /

exit ( 0 ) ;

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

50

Chapitre2. Le langage C

Code source interfaces (*.h)identite.h

#ifndef IDENTITE_H #define IDENTITE_H 3 4 #define FALSE 0 5 #define TRUE 1 6 7 extern int a f f ic h e Id ( const char msg, int id ) ; 8 9 #endif / IDENTITE_H /1 2 10

principal.h1

2

#ifndef PRINCIPAL_H #define PRINCIPAL_H 3 4 #endif / PRINCIPAL_H /5

Production de l'ex cutable Pr compilation1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

{61} : cpp src/identite.c > src/tmp.c cpp: Error: src/identite.c: 8: Cannot open file identite.h for #include {62} : cpp -Iinclude src/identite.c > src/tmp.c {63} : ls -l src total 10 -rw-r--r-1 alissali thesardls 617 Feb 11 11:41 identite.c -rw-r--r-1 alissali thesardls 1112 Feb 11 11:39 principal.c -rw-r----1 alissali thesardls 6990 Feb 11 11:49 tmp.c {64} : cat src/tmp.c ...] extern FILE _iob 8]; ...] extern int fprintf(); ...] # 8 "src/identite.c" # 1 "include/identite.h" ...] extern int afficheId(const char *msg, int id); ...] # 9 "src/identite.c" int afficheId(const char *message, int id) { if(fprintf((&_iob 1]),"%s : %d\n", message,id) < 0 ) return(0); return(1)

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

2.5 La compilation S par e29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

51

} {65} : grep stdout /usr/include/stdio.h #define stdout (&_iob 1]) ...] {66} : !cpp:p cpp -Iinclude src/identite.c > src/tmp.c {67} : !!:s/-I/-D__STDC__ -D_POSIX_SOURCE -I/ cpp -D__STDC__ -D_POSIX_SOURCE -Iinclude src/identite.c > src/tmp.c {68} : ls -l src total 11 -rw-r--r-1 alissali thesardls 617 Feb 11 11:41 identite.c -rw-r--r-1 alissali thesardls 1112 Feb 11 11:39 principal.c -rw-r----1 alissali thesardls 4881 Feb 11 12:20 tmp.c {69} : cat src/tmp.c ...] extern int fprintf(FILE *, const char *, ...); ...]

Compilation1 2 3 4

A. V ri cation de la syntaxe

{94} ~/Unix/Compilation/src : cc -c tmp.c /usr/lib/cmplrs/cc/cfe: Error: identite.c, line 19: Syntax Error return(1); --^

B. G n ration du code objet1 2 3 4 5 6 7 8 9

On relance la compilation apres la correction de l'erreur de syntaxe {96} ~/Unix/Compilation/src : cc -c tmp.c {97} ~/Unix/Compilation/src : ls -l -rw-r--r-1 alissali thesardls 24821 Feb 08 16:47 -rw-r--r-1 alissali thesardls 618 Feb 08 16:44 -rw-r--r-1 alissali thesardls 1011 Feb 08 16:26 -rw-r--r-1 alissali thesardls 7272 Feb 08 16:46 -rw-r--r-1 alissali thesardls 2768 Feb 08 16:46

a.out identite.c principal.c tmp.c tmp.o

dition des liens1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

{98} ~/Unix/Compilation/src : cc tmp.o ld: Unresolved: main {99} ~/Unix/Compilation/src : cc -c -I../include principal.c {100} ~/Unix/Compilation/src : ls -l total 47 -rw-r--r-1 alissali thesardls 24821 Feb 08 16:47 a.out -rw-r--r-1 alissali thesardls 618 Feb 08 16:44 identite.c -rw-r--r-1 alissali thesardls 1011 Feb 08 16:26 principal.c -rw-r--r-1 alissali thesardls 6008 Feb 08 16:50 principal.o -rw-r--r-1 alissali thesardls 7272 Feb 08 16:46 tmp.c -rw-r--r-1 alissali thesardls 2768 Feb 08 16:46 tmp.o {101} ~/Unix/Compilation/src : cc principal.o tmp.o {102} ~/Unix/Compilation/src : ls -l

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

52Module principal principal.h #ifndef ... #define Module identite identite.h #ifndef ... #define int afficheId(...);

Chapitre2. Le langage C

include

#endif principal.c #include"identite.h" #include"principal.h" int main(...) { ... afficheId(...); ... }

#endif identite.c #include"identite.h" src int afficheId(...) { ... }

Prcompilation

int afficheId(...); ... int main(...) { ... afficheId(...); ... }

int afficheId(...); fichiers temporaires

int afficheId(...) { ... }

Fig.

2.5 Pr compilation des deux modules de l'exemple.

17 18 19 20 21 22 23

total 49 -rwxr-xr-x -rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--

1 1 1 1 1 1

alissali alissali alissali alissali alissali alissali

thesardls thesardls thesardls thesardls thesardls thesardls

26720 618 1011 6008 7272 2768

Feb Feb Feb Feb Feb Feb

08 08 08 08 08 08

16:51 16:44 16:26 16:50 16:46 16:46

a.out identite.c principal.c principal.o tmp.c tmp.o

Exemples d'ex cution1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

{97} bin/progC Programme : bin/progC je suis l'utilisateur : 10396 mon groupe est : 1010 je suis le processus : 1633 mon pere est le processus : 1210 {98} !! bin/progC Programme : bin/progC je suis l'utilisateur : 10396 mon groupe est : 1010 je suis le processus : 1634 mon pere est le processus : 1210 {99} bin/progC1 Programme : bin/progC1 je suis l'utilisateur : 10396 mon groupe est : 1010 je suis le processus : 1635 mon pere est le processus : 1210

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

2.5 La compilation S par e

53

Compilation

Vrification de la syntaxe

correction des erreurs

Rfrence/appel de afficheId

fichiers temporaires ou permanents

Code objet de afficheId

dition des liens

Excutable

Fig.

2.6 Compilation et d' dition des lien des deux modules de l'exemple.

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

54

Chapitre2. Le langage C

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

Chapitre 3

Algorithmique et structures de donn es avanc es3.1 Fondements et principes de l'algorithmiquedonn es, etc.) permettant d'accomplir une t che en un nombre ni de pas.

D nition 3.1.1 Un algorithme est une s quence bien d nie d'op rations (calcul, manipulation deEn principe un algorithme est ind pendant de toute implantation. Cependant dans la pratique de la programmation il s'av re indispensable de tenir compte des capacit s du langage de programmation utilis .

3.1.1

La conception (et la v ri cation) d'un algorithme passe par les tapes suivantes : Analyse: d nition du probl me en termes de s quences d'op rations de calcul de stockage de donn es, etc.; Conception: d nition pr cise (proche du langage de programmation) des donn es, des traitements et de leur s quencement ; Implantation: traduction et r alisation de l'algorithme dans le langage cible ; Test : v ri cation du bon fonctionnement de l'algorithme.

l ments de conception d'algorithmes

3.2.1 Analyse

3.2 Exemple: calcul de la somme des N premiers entiers positifs

1 Determiner N 2 Calculer la somme des N premiers entiers positifs 3 Renvoyer du r sultat 1 2 3 2Premier ra nement : lire N boucle sur les N premiers entiers positifs calcul de la somme a cher somme Deuxi me ra nement somme < 0 pour i < 1 N somme < somme + i 55

56

Chapitre3. Algorithmique et structures de donn es avanc es

3.2.2 Conception1 2 3 4 5 6 7 8 9

entier N, i , somme crire " Donner N" lire somme si N $ n leq$ 0 alors ERREUR pour i < 1 N faire somme < somme + i crire " La somme est :a : " somme

3.2.3 ImplantationsommeNentiers.c

#include 3 int main( void ) 4 f 5 int n , i , somme = 0 ; 6 7 p r in t f ( "Donner n : n n" ) ; 8 scanf ("%d" , & n ) ; 9 if ( n 1 f a ir e 2 . 1 . parcours de droite gauche trouver x < el permuter ( x , el ) 2 . 2 . parcours de gauche droitec M. Alissali, Universit du Maine 1998

Introduction l'algorithmique en C/Unix

3.6 Algorithmes de tri de tableau7 8 9 10

67

trouver x > el permuter ( x , el ) 3 . 1 . separer partie gauche 3 . 2 . separer partie droite

Ra nementDans 2.1. et 2.2. la recherche de l' l ment permuter se fait partir de l'emplacement de la derni re permutation. Il faut d teminer le d but et la n de chaque parcours .

Exemple22 12 12 12 10 10 25 25 22 10 12 12 21 21 21 21 21 21 10 10 10 22 22 22 45 45 45 45 45 25 12 22 25 25 25 45 53 53 53 53 53 53

Conception1 2 3 4 5 6 7 8

Entr es tabEnt:a : tableau t r i e r deb , fin :a : lim it e s du t r i Sortie tabEnt:a : tableau t r i Locales g , d:a : indice de parcours

Donn es

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Traitement d but g < ;adeb;; d < fin tant que d > g faire d but tant que tabEnt d ] < tabEbt g ] faire decrementer d si d 4 #include " triSep . h" 5 6 #define TAILLE 10000 7 8 int main( void ) 9 f 10 int tab TAILLE ] , i , maxRand = TAILLE 10 ; 11 12 for ( i = 0 ; i < TAILLE ; i ++)2 13

/ Ce programme ne f a i t pas d ' E/S . I l est destin

un t e s t de performance /

tab i ] = rand () % maxRand;

14 15 16

g

triSep ( tab , 0 , TAILLE 1 ) ;

Le tableau 3.2 montre une comparaison des performances r elles des di rents algorithmes pr sent s ici. Les essais ont eu lieu sur une machine Sun Sparcstation 20.Tab.

Performances

3.2 Comparasion des performances r elles des algorithmes de tri. Algorithme Insertion change S paration S paration S paration + sauvegarde taille des Temps d'ex cution(sec) donn es r el utilisateur syst me 10 000 34.3 15.2 0.1 10 000 1:43.0 31.8 0.0 10 000 0.2 0.0 0.0 100 000 2.4 1.0 0.0 100 000 15.4 5.9 0.4

Introduction l'algorithmique en C/Unix

c M. Alissali, Universit du Maine 1998

70

Chapitre3. Algorithmique et structures de donn es avanc es

3.7 Types de donn es abstraitsdonn es.

d nition 1 : un Type de Donn es Abstrait (TDA) est un ensemble de donn es et d'op rations sur ces d nition 2 : un TDA est un ensemble de donn es organis de sorte que les sp ci cations des objetset des op rations sur ces objets soient s par es de la repr sentation interne des objets de de la mise en oeuvre des op rations.

Les TDA sont n s de pr occupation de g nie logiciel telles que l'abstraction, l'encapsulation et la v ri cation de type. En e et les TDA g n ralisent les types pr d nis (ou types simples). exemples : Le type entier muni des op rations + - % / < > = >= suiv ) fin

Le test de n de liste revient tester si l' l ment manipul n'a pas de successeur (donc ne pointe sur rien) : 1 bool en f in L is t e ( typeNoeud courant )4

2 3

Le parcours d'une liste cha n e ne peut se faire que de mani re s quentielle ; en faisant avancer un pointeur donn d'un seul n ud la fois : 1 parcours ( typeNoeud t e t e L is t e )2 3 4 5 6 7 8 9

d but retour ( courant >suiv = NULL) fin

d but

d but fin fin

ptrParcours < t e t e L is t e tant que non f in L is t e ( ptrParcours ) Operation ( s ) sur l ' l ment courant , p. e . a f f ic h e ( ptrParcours ) ptrParcours < ptrParcours >suivant

Par exemple, ayant disposition une fonction afficheContenus pour l'a chage des champs d'un n ud, l'a chage d'une lsite peut se faire de la mani re suivante : 1 a f f i c h e r ( typeNoeud t e t e L is t e )2 3 4 5 6 7 8 9 10

d but

d but fin fin

ptrParcours < t e t e L is t e tant que non f in L is t e ( ptrParcours ) afficheContenus ( ptrParcours >cont ) ptrParcours < ptrParcours >suivant

Pour rechercher un l ment il faut faire un parcours en comparant l' l ment point avec l' l ment recherch . En cas d' galit on retourne la valeur courante du pointeur de parcours, si la boucle se termine l' l ment n'a pas t trouv , ce qui doit tre indiqu e par la valeur retourn e, NULL dans notre cas : 1 typeNoeud trouver ( typeNoeud t e t e L is t e , typeContenus cont )2 3 4 5 6 7

d but

8

d but si cont = ptrParcours >cont retour ( ptrParcours ) ptrParcours < ptrParcours >suivant finIntroduction l'algorithmique en C/Unix c M. Alissali, Universit du Maine 1998

ptrParcours < t e t e L is t e tant que non f in L is t e ( ptrParcours )

749 10 11

Chapitre3. Algorithmique et structures de donn es avanc es

Il s'agit ici du cas g n ral et la comparaison (ligne 6) est not e simplement = . Dans une r alisation/utilisation concr te cette op ration doit tre remplac e par la comparaison ad quate ventuellement implant e l'aide d'une fonction, de la m me mani re que l'adaptation du tri rapide dans l'application BDU (cf. 4.6) par exemple. Pour l'insertion et la suppression on traite d'abord le cas le plus simple : l'op ration s'e ectue un emplacement donn de la liste. premi re vue un nouvel l ment ne peut tre ins r qu'apr s l'emplacement sp ci . Le passage des param tres doit se faire par r f rence (c. .d. adresse ou pointeur qui d signe l' l ment) puisqu'ils seront modi s, ce qui en m me temps simpli e l' criture : 1 in s e r e r Dir e c t ( typeNoeud noeudAinserer , typeNoeud emplacement)2 3