Les noms logiques
Beaucoup de gens mélangent les symboles et les noms logiques. Je n'ai jamais compris pourquoi. Ce sont en effet des concepts totalement différents.
Un symbole permet de conserver dans un espace mémoire nommé (le nom du symbole est la référence à cet espace mémoire) une donnée quelconque. Ce peut être votre marque de bière préférée ou l'âge de votre chien, peu importe. Ces valeurs peuvent être manipulées par une procédure DCL pour mener à bien un traitement donné. En définitive, ce sont des variables comme il en existe dans tous les langages de programmation (sauf peut-être l'assembleur).
Maintenant les noms logiques. On les utilise pour faire référence à des objets sous OpenVMS. Ces objets sont le plus souvent des fichiers ou des répertoires, mais ils peuvent également être des queues d'impression, des portes d'entrée/sortie etc. Leur but premier est de permettre l'identification des ces objets par un nom qui sera indépendant de la location physique. De cette façon, si l'objet en question est déplacé, tous les programmes y faisant référence continueront à fonctionner en autant que la référence logique soit modifiée pour refléter le changement.
Ainsi, on peut avoir un fichier ZORGLUB.DAT sur DUA1:[SPIROU]. Advenant un bris du disque DUA1: (ou n'importe quel autre évènement à votre choix) on pourra transporter le fichier sur le disque DUA2: et continuer ensuite les opérations immédiatement si l'on a pris soin d'utiliser un nom logique pour référencer le fichier.
Bien utilisés, les noms logiques sont la plus belle fonctionalité disponible sur OpenVMS. Ils peuvent permettre de partager des programmes d'applications avec plusieurs environnements (production, tests ou encore pour la distribution commerciale) et ce, sans devoir changer une seule ligne de code. Le code utilisant les noms logiques est beaucoup plus facilement portable, et les données peuvent être distribuées sur plusieurs disques sans affecter le fonctionnement de l'application.
Voyons maintenant comment cela fonctionne...
Un peu de syntaxe
Les commandes DEFINE et ASSIGN permettent de créer des assignations logiques. Il sera ici question uniquement de DEFINE, pour la bonne raison que ASSIGN est plutôt un résidu de RSTS (sur les bons vieux PDP), est de moins en moins utilisé et offre moins de flexibilité. Si vous rencontrez une procédure avec des ASSIGN, rappelez-vous seulement que les paramètres de la commande sont inversés, et que le résultat est (à peu près) le même que celui qui aurait été obtenu avec DEFINE (je ne citerai pas les exceptions).
La syntaxe générale est la suivante:
$ DEFINE [/qualificatif]
nom_logique objet
Le nom logique est bien entendu le "nouveau nom" que vous désirez donner à l'objet. Les qualificatifs sont optionnels, et ils seront expliqués plus loin.
Un nom logique peut référer à une spécification de fichier ou à une partie de celle-ci. Utilisé dans une commande, le nom logique est vu comme s'il s'agissait d'un disque, et il est régi par les mêmes régles syntaxiques. Autrement dit, il est suivi du deux-points (:). Ce n'est pas une syntaxe obligatoire s'il n'est pas suivi d'autres éléments d'une spécification de fichier, mais vous gagnerez à toujours mettre le deux-point. Dans la commande DEFINE cependant il ne faut pas lui mettre les deux-points.
Le nom logique peut par exemple tenir lieu du disque et du répertoire seulement, comme dans l'exemple suivant:
$ DEFINE MON_REPERTOIRE
DUA1:[SYLTREM] $ DIRECTORY MON_REPERTOIRE:LOGIN.COM Directory DUA1:[SYLTREM] LOGIN.COM;47 18/20 15-MAR-1999 14:13:52.31 Total of 1 file, 18/20 blocks. |
Notez bien la syntaxe dans la commande
DIRECTORY. Le nom logique est utilisé comme un disque, donc suivi du deux-point (:) Dans la commande DEFINE par contre on donne le nom seulement, sans les deux-points. |
On aurait également pu faire référence au fichier DUA1:[SYLTREM]LOGIN.COM directement:
$ DEFINE MON_LOGIN DUA1:[SYLTREM]LOGIN.COM $ DIRECTORY MON_LOGIN Directory DUA1:[SYLTREM] LOGIN.COM;47 18/20 15-MAR-1999 14:13:52.31 Total of 1 file, 18/20 blocks. |
Ici, le deux-point a été omis. Il est facultatif dans ce cas, parce qu'il n'est pas besoin d'un délimiteur, le nom logique n'étant pas suivi d'un nom de fichier comme dans l'exemple précédent. |
Dans cette dernière commande, le deux-point après MON_LOGIN est facultatif, mais il offre un avantage: celui de vous assurer que DCL interprétera bien le nom donné comme étant un nom logique et non pas un nom de fichier. Par exemple, si on aurait omis la commande DEFINE, le résultat de la commande DIRECTORY pourait être tout à fait différent. Voyons cela:
$ DIRECTORY MON_LOGIN %DIRECT-W-NOFILES, no files found |
Sans le deux-points: si le nom logique n'existe pas, DCL interprétera MON_LOGIN comme un nom de fichier. |
$ DIRECTORY MON_LOGIN: %DIRECT-E-OPENIN, error opening MON_LOGIN:[SYLTREM]*.*;* as input -RMS-F-DEV, error in device name or inappropriate device type for operation |
Avec le deux-points: on précise explicitement qu'il s'agit d'un nom logique. |
Puisque le nom logique n'existait pas, DCL a retourné une erreur plus explicite avec la seconde commande, dans laquelle on a pris soin de mettre les deux-points. On voit ainsi que le nom logique identifiant le fichier DUA1:[SYLTREM]LOGIN.COM n'a pas été créé (vous remarquerez dans le message que MON_LOGIN: est bien perçu par DCL comme un nom de disque (device). Si l'on aurait utilisé la syntaxe du premier exemple on aurait cru faussement que le fichier n'existait pas.
Poussons un peu plus loin...
Un nom logique peut contenir une référence à un autre nom logique. De fait, si on veut bien en appliquer l'usage, les exemples précédents sont bien mauvais. En effet, les noms physiques de disques devraient toujours être remplacés par des noms logiques de manière a permettre une plus grande flexibilité.
$ DEFINE /TRANSLATION=CONCEAL
MON_DISQUE DUA1: $ DEFINE MON_REPERTOIRE MON_DISQUE:[SYLTREM] $ DIRECTORY MON_REPERTOIRE:LOGIN.COM Directory MON_DISQUE:[SYLTREM] LOGIN.COM;47 18/20 15-MAR-1999 14:13:52.31 15-MAR-1999 14:13:52.91 Total of 1 file, 18/20 blocks. |
Dans la première commande DEFINE, on a ajouté le qualificatif /TRANSLATION avec la valeur CONCEAl (caché). Cela indique que l'on veut que le nom de disque affiché par une commande ne soit jamais le nom physique (traduction du nom logique) mais bien le nom logique lui-même comme vous pouvez le voir dans le résultat de la commande DIRECTORY ci-contre. |
Ce dernier exemple représente plus convenablement ce qu'il est recommandé de faire.
On aurait pu pousser encore plus loin en définissant un autre nom logique pour le fichier
LOGIN.COM, de la façon suivante:
$ DEFINE MON_LOGIN MON_REPERTOIRE:LOGIN.COM
À partir de ce moment, un programme utilisant le fichier LOGIN.COM pourrait le
référencer directement par "MON_LOGIN:". Advenant que le
fichier soit déplacé sur un autre disque ou un autre répertoire, le seul fait de
redéfinir le nom logique MON_DISQUE ou MON_REPERTOIRE, selon le cas, permettrait au
programme d'accéder le fichier sans aucune autre modification. Imaginez le temps sauvé
si on a une libraire comprenant plusieurs dizaines de programmes utilisant ce fichier!
Noms logiques "racine" (rooted logicals)
On peut définir un nom logique pointant à un répertoire racine. Cette manière de faire permet de créer des noms logiques de sous-répertoires, lesquels ont tous la même racine.
Par exemple:
$ DEFINE SYLTREM SYL$DISQUE:[SYLTREM.]
$ DIRECTORY SYLTREM:[EXEMPLES] équivaudrait à DIRECTORY
SYL$DISQUE:[SYLTREM.EXEMPLES]
$ DIRECTORY SYLTREM:[DOCUM] équivaudrait à DIRECTORY
SYL$DISQUE:[SYLTREM.DOCUM]
$ DIRECTORY SYLTREM:[000000] équivaudrait à DIRECTORY
SYL$DISQUE:[SYLTREM]
Remarquez bien le point (.) qui suit le nom du répertoire dans la commande DEFINE. C'est ce point qui fait de ce nom logique une "racine". À partir de là, on peut presque considérer SYLTREM: comme un disque et les sous-répertoires [.DOCUM] et [.EXEMPLES] comme des répertoire principaux de ce disque.
Beaucoup de logiciels utilisent cette méthode pour définir les noms logiques de l'application en se basant sur la location de la procédure de commande qui définit ces noms logiques. Si le logiciel a été installé sur APP$DISQUE:[APPLICATION] et ses sous-répertoires, la procédure d'initialisation des noms logiques se retrouverait dans ce répertoire principal et pourrait contenir les commandes suivantes:
$ PROC =
F$ENVIRONMENT("PROCEDURE") $ $ PROC_LOC = F$PARSE(PROC,,,"DEVICE") - + F$PARSE(PROC,,,"DIRECTORY") - - "]" + ".]" $ DEFINE APP_ROOT 'PROC_LOC $ DEFINE SRC APP_ROOT:[SOURCES] $ DEFINE EXE APP_ROOT:[EXECUTABLES] |
! Nom de la procédure. Por
l'exemple nommons-là ! APP$DISQUE:[APPLICATION]SETUP_LOGICALS.COM ! Extraction du disque et répertoire (c'est le répertoire ! principal de l'application) et ajout du point (.) ! Nom logique racine ! Répertoire des sources APP$DISQUE:[APPLICATION.SOURCES] ! Répertoire des exécutables APP$DISQUE:[APPLICATION.EXECUTABLES] |
C'est une façon très commode pour une application de définir les noms logiques utilisés par celle-ci sans se soucier du répertoire dans lequel un client l'aura éventuellement installé. De plus, si on doit déplacer l'application sur un disque différent, il n'est pas nécessaure de la réinstaller; il suffira seulement d'exécuter à nouveau la procédure de définition des noms logiques un coup le déplacement complété.
Listes de recherche
Un nom logique peut contenir plus d'une équivalence. La liste d'équivalences sera alors utilisée comme liste de recherche pour trouver un fichier.
Si par exemple les fichiers d'une application sont répartis sur plusieurs disques ou répertoires, on pourra définir une liste de recherche pointant à tous ces endroits. Lorsque l'application tentera d'ouvrir un fichier en utilisant ce nom logique on consultera chaque répertoire en séquence, jusqu'à ce que le fichier soit trouvé.
Par exemple:
$ DEFINE DATA DATA_01$DISQUE:[DATA], DATA_02$DISQUE:[DATA]
$ DIR DATA:FICHIER.DAT
DATA_02$DISQUE:[DATA]FICHIER.DAT
Total of 1 file.
Le fichier n'existait pas sur DATA_01$DISQUE:[DATA] mais a été trouvé sur DATA_02$DISQUE:[DATA]
Tables de noms logiques
Les noms logiques sont divisés en plusieurs sections, appelées tables de noms logiques. Ainsi, certains noms logiques sont locaux à un utilisateur ou à un groupe, d'autres sont globaux, pouvant être vus par tous les utilisateurs du système, etc. Voyons cela en détail:
Nom de la table |
Vu par |
Privilèges requis |
LNM$PROCESS | Le processus courant (session interactive, batch, etc) | Aucun |
LNM$JOB | L'ensemble de processus formé par un processus mère, et tous ses enfants (sous-processus) - voir commande SPAWN | Aucun |
LNM$GROUP_nnnnnn | Les processus de tous les utilisateurs du groupe UIC nnnnnn - voir informations sur la sécurité OpenVMS de base | GRPNAM |
LNM$SYSTEM | Tous les processus présents sur le système | SYSNAM |
Pour trouver l'équivalence (nom physique) d'un nom logique, OpenVMS regarde dans les tables dans l'ordre énoncé dans le tableau ci-dessus. Si le nom logique a été défini de façon différente dans plus d'une table, celle apparaissant au haut de la liste aura préséance. De cette façon, on pourra donner une valeur par défaut dans la table LNM$SYSTEM par exemple (cette table a le moins de priorité dans la recherche d'équivalence), mais un utilisateur ou un groupe d'utilisateurs pourra donner une valeur différente.
Citons trois exemples en choisissant parmi les noms logiques qui sont définis
automatiquement par OpenVMS à l'ouverture d'une session de travail: Notez qu'aucun nom
logique n'est créé par OpenVMS dans la table LNM$GROUP; il revient à l'administrateur
du système de définir des valeurs pour les groupes d'utilisateurs selon les besoins.
SYS$DISK | Nom du disque par défaut (sur lequel se trouve le répertoire courant). Chaque processus a une valeur différente pour ce nom logique que l'on retrouve dans la table LNM$PROCESS. |
SYS$LOGIN | Répertoire principal de l'utilisateur qui a ouvert la session interactive. Cette valeur reste la même pour tous les sous-processus (voir commande SPAWN) créés par la suite et est donc conservée dans LNM$JOB. |
SYS$SYSDEVICE | Nom du disque sur lequel se trouve le système d'exploitation. Cette valeur est la même pour tous les utilisateurs; elle se retrouve dans la table LNM$SYSTEM |
Affichage des équivalences
On peut afficher les équivalences d'un nom logique avec la commande SHOW LOGICAL:
$ SHOW LOGICAL EXE | |
A B C D E F G |
"EXE" = "MODIF:" (LNM$PROCESS_TABLE) = "PROD_EXE:" 1 "MODIF" = "SYS$LOGIN:[SYLTREM.MODIFICATIONS]" (LNM$PROCESS_TABLE) 2 "SYS$LOGIN" = "DEV$DISQUE:[SYLTREM]" (LNM$JOB_87259280) 1 "PROD_EXE" = "PROD$DISQUE:[IMAGES]" (LNM$SYSTEM_TABLE) "EXE" = "PROD_EXE:" (LNM$SYSTEM_TABLE) 1 "PROD_EXE" = "PROD$DISQUE:[IMAGES]" (LNM$SYSTEM_TABLE) |
À première vue, la sortie de cette commande est assez difficile à suivre. Voyons donc
ce qu'on peut y lire:
A B |
D'abord, on voit l'équivalence du nom logique EXE, qui est une liste de recherche (2 équivalences, lignes A et B). EXE est défini dans la table LNM$PROCESS |
C | Ensuite, puisque la première équivalence correspond à un autre nom logique (MODIF), on voit l'équivalence de ce dernier. Il est également défini dans la table LNM$PROCESS |
D | MODIF fait lui-même référence au nom logique SYS$LOGIN. On affiche donc son équivalence qui se trouve dans LNM$JOB |
E | Il s'agit de la deuxième équivalence (ligne B) du nom logique EXE |
F | Le nom logique EXE est également défini dans la table LNM$SYSTEM. On affiche donc les équivalences pour EXE tel que défini dans cette table. |
G | L'équivalence de EXE à la ligne F réfère à un nom logique. On affiche ici l'équivalence de ce dernier. |
On voit ici que l'utilisateur a créé une liste de recherche pour EXE.
S'il n'avait pas redéfini EXE, les fichiers auraient été trouvés dans le répertoire
PROD$DISQUE:[IMAGES] seulement mais EXE a été redéfini dans la table LNM$PROCESS pour
faire en sorte que l'on cherche d'abord dans DEV$DISQUE:[SYLTREM] puis ensuite dans
PROD$DISQUE:[IMAGES].
Cette méthode peut être utilisée lors des tests d'applications. Une nouvelle version
d'un programme pourrait être placée dans DEV$DISQUE:[SYLTREM] alors que les autres
programmes de l'application demeurerait dans le répertoire original PROD$DISQUE:[IMAGES].
Il devient alors facile de faire des tests sans avoir à recréer un environnement de
tests complet.
Vous avez peut-être constaté que les équivalences des noms logiques PROD$DISQUE et DEV$DISQUE n'ont pas été affichées. Cela parce que ces deux noms logiques ont été définis avec le qualificatif /TRANSLATION=TERMINAL.
Autre chose aussi: SHOW LOGICAL montre la table de nom
logique LNM$JOB_87259280, et moi je parle toujours de LNM$JOB. En effet, LNM$JOB est un
nom logique pointant à la table LNM$JOB_87259280, dont le nom a été a été crée
dynamiquement par OpenVMS à l'ouverture de votre session de travail. OpenVMS définit le
nom logique LNM$JOB pour vous faciliter la vie.
Modes
Un nom logique estt également gouverné par un mode, qui indique son rang. Certaines applications préférerons un mode à un autre mais il s'agit généralement là d'applications proches du système d'exploitation.
Le mode qui est le plus utile dans des applications utilisateur est le mode USER; il
permet de définir un nom logique qui aura une durée de vie limitée, c'est à dire le
temps de l'exécution de la prochaine image (.EXE) ou procédure de commande (.COM). Cela
peut s'avérer très utile dans certains contextes. Une utilisation fréquente est pour
rediriger, dans une procédure de commande, les entrées de caractères au clavier.
En règle générale, ces caractères sont lus sur l'unité SYS$INPUT. Cependant dans le
contexted'une procédure de commande, SYS$INPUT est la procédure elle-même. Pour lire
des caractères tapés au clavier, il y a lieu de faire pointer SYS$INPUT vers SYS$COMMAND
pendant l'exécution de la procédure.
$ DEFINE /USER SYS$INPUT SYS$COMMAND
Mode | Qualificatif | Privilège requis | Usage |
Utilisateur | /USER | Aucun | Sa durée de vie est égale au temps d'exécution de la prochaine image (.EXE) ou procédure de commande (.COM) exécutée |
Superviseur | /SUPERVISOR (default) | Aucun | Usage normal |
Executif | /EXECUTIVE | SYSNAM | Devrait être utilisé pour tous les noms logiques utilisés par des fonctions système |
Il y a tellement à dire sur ce sujet que je n'ai pas fait allusion au quart des possibilités. On peut créer ses propres tables de noms logiques, changer l'ordre habituel de recherche dans ces tables pour la traduction des noms logiques, etc. Tout cela en créant... des noms logiques. Une grande partie de la fonctionalité de OpenVMS repose sur ceux-ci, et les concepts peuvent parfois devenir assez déconcertant par moments. Plus vous les apprivoiserez, plus vous serez à même d'entrevoir de nouvelles possibilités.
DEFINE
logical-name |
|