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).