• Aucun résultat trouvé

Un programmeUNIXtypique prend un ou plusieurs flux en entr´ee, op`ere un trai-tement dessus et ressort un ou plusieurs flux. L’exemple le plus simple est celui d’un programme s’ex´ecutant sur un terminal : il attend en entr´ee des caract`eres tap´es par l’utilisateur, interpr`ete ces caract`eres d’une certaine mani`ere et ressort un r´esultat sur le mˆeme terminal. Par exemple, le programme mail permet d’envoyer un email `a la main :

unix% mail moimeme Subject: essai 144

.

Un exemple plus ´elabor´e, qui reprend le mˆeme principe, est le suivant. Plutˆot que lire les commandes sur le clavier, le programme va lire les caract`eres sur son entr´ee standard, ici un fichier contenant le nombre 144:

unix% mail moimeme < cmds

Notez la diff´erence avec la commande unix% mail cmds

qui transforme cmds en un argument pass´e au programme et qui provoque une erreur (`a moins qu’un utilisateur s’appellecmds. . . ).

D`es qu’un programme s’ex´ecute, il lui est associ´e trois flux : le premier est le flux d’entr´ee, le deuxi`eme le flux de sortie, le troisi`eme est un flux destin´e `a recueillir les erreurs d’ex´ecution. Ainsi, on peut rediriger la sortie standard d’un programme dans un fichier en utilisant :

unix% java carre < cmds > resultat

En sh ou enbash, la sortie d’erreur est r´ecup´er´ee comme suit : unix% mail < cmds > resultat 2> erreurs

3Dans Linux, c’est un peu diff´erent : des processus sp´eciaux sont cr´e´es en parall`ele au lancement, mais l’id´ee est grosso-modo la mˆeme.

Pour le moment, nous nous sommes content´es de g´erer les flux de fa¸con simple, en les fabriquant `a l’aide du contenu de fichiers. On peut ´egalement prendre un flux sortant d’un programme pour qu’il serve d’entr´ee `a un autre programme. On peut lister les fichiers d’un r´epertoire et leur taille `a l’aide de la commande ls -s:

unix% ls -s > fic unix% cat fic total 210

138 dps 1 poly.tex 51 unix.tex 20 unixsys.tex

Une autre commande d’UNIX bien commode est celle permettant de trier un fichier

`a l’aide de plusieurs crit`eres. Par exemple, sort +0n ficpermet de trier les lignes de fic suivant la premi`ere colonne :

unix% sort +0n fic total 210

1 poly.tex 20 unixsys.tex 51 unix.tex 138 dps

Pour obtenir ce r´esultat, on a utilis´e un fichier interm´ediaire, alors qu’on aurait pu proc´eder en une seule fois `a l’aide de :

unix% ls -s | sort +0n

Le pipe (tube) permet ainsi de mettre en communucation la sortie standard de ls -s avec l’entr´ee standard de sort. On peut bien sˆur empiler les tubes, et m´elanger `a volont´e >, <et |.

On a ainsi isol´e un des points importants de la philosophie d’UNIX: on construit des primitives puissantes, et on les assemble `a la fa¸con d’un m´ecano pour obtenir des op´erations plus complexes. On n’insistera jamais assez sur l’importance de certaines primitives, comme cat,echo, etc.

Annexes

163

Compl´ ements

A.1 Exceptions

Les exceptions sont des objets de la classe Exception. Il existe aussi une classe Error moins utilis´ee pour les erreurs syst`eme. Toutes les deux sont des sous-classes de la classe Throwable, dont tous les objets peuvent ˆetre appliqu´es `a l’op´erateur throw, comme suit :

throw e ;

Ainsi on peut ´ecrire en se servant de deux constructeurs de la classe Exception: throw new Exception();

throw new Exception ("Acc`es interdit dans un tableau");

Heureusement, dans les classes des biblioth`eques standard, beaucoup d’exceptions sont d´ej`a pr´e-d´efinies, par exemple IndexOutOfBoundsException. On r´ecup`ere une excep-tion par l’instrucexcep-tion try. . .catch. Par exemple

try {

// un programme compliqu´e } catch ( IOException e) {

// essayer de r´eparer cette erreur d’entr´ee/sortie }

catch ( Exception e) {

// essayer de r´eparer cette erreur plus g´en´erale }

Si on veut faire un traitement uniforme en fin de l’instruction try, que l’on passe ou non par une exception, que le contrˆole sorte ou non de l’instruction par une rupture de s´equence comme un return, break, etc, on ´ecrit

try {

// un programme compliqu´e } catch ( IOException e) {

// essayer de r´eparer cette erreur d’entr´ee/sortie }

165

catch ( Exception e) {

//essayer de r´eparer cette erreur plus g´en´erale }

finally {

// un peu de nettoyage }

Il y a deux types d’exceptions. On doit d´eclarer les exceptions v´erifi´ees derri`ere le mot-cl´ethrowsdans la signature des fonctions qui les l`event. Ce n’est pas la peine pour les exceptions non v´erifi´eesqui se reconnaissent en appartenant `a une sous-classe de la classe RuntimeException. Ainsi

static int lire () throws IOException, ParseException { int n;

BufferedReader in =

new BufferedReader(new InputStreamReader(System.in));

System.out.print ("Taille du carr´e magique, svp?:: ");

n = Integer.parseInt (in.readLine());

A.2.1 Fonctions ´el´ementaires

Les fonctions sont inspir´ees de la libraire QuickDraw du Macintosh, mais fonc-tionnent aussi sur les stations Unix. Sur Macintosh, une fenˆetre Drawing permet de g´erer un ´ecran typiquement de 1024×768 points. L’origine du syst`eme de coordonn´ees est en haut et `a gauche. L’axe des xva classiquement de la gauche vers la droite, l’axe des y va plus curieusement du haut vers le bas (c’est une vieille tradition de l’infor-matique, dure `a remettre en cause). En QuickDraw, x et y sont souvent appel´es h (horizontal) et v (vertical). Il y a une notion de point courant et de crayon avec une taille et une couleur courantes. On peut d´eplacer le crayon, en le levant ou en dessinant des vecteurs par les fonctions suivantes

moveTo (x, y) D´eplace le crayon aux coordonn´ees absolues x, y.

move (dx, dy) D´eplace le crayon en relatif dedx, dy.

lineTo (x, y) Trace une ligne depuis le point courant jusqu’au point de coordonn´ees x, y.

line (dx, dy) Trace le vecteur (dx, dy) depuis le point courant.

penPat(pattern) Change la couleur du crayon : white, black, gray, dkGray (dark gray), ltGray(light gray).

penSize(dx, dy) Change la taille du crayon. La taille par d´efaut est (1, 1). Toutes les op´erations de trac´e peuvent se faire avec une certaine ´epaisseur du crayon.

penMode(mode) Change le mode d’´ecriture :patCopy (mode par d´efaut qui efface ce sur quoi on trace), patOr (mode Union, i.e. sans effacer ce sur quoi on trace), patXor(mode Xor, i.e. en inversant ce sur quoi on trace).