Je lis le code source de coreutils pour apprendre la programmation sous Linux.
Je trouve que dans la plupart des programmes comme ls.c, cat.c, ils invoquent la fonction de macro initialize_main () sur les premières lignes. J’ai donc cherché dans system.h pour trouver l’implémentation:
/* Redirection and wildcarding when done by the utility itself. Generally a noop, but used in particular for native VMS. */ #ifndef initialize_main # define initialize_main(ac, av) #endif
Je ne comprends pas pourquoi définir une telle macro et je ne comprends pas le commentaire.
La première étape pour comprendre le commentaire est de savoir ce qu’est le VMS. Alors voici un lien pour cela: http://en.wikipedia.org/wiki/OpenVMS
L’étape suivante consiste à comprendre la redirection et le joker. Dans Linux et les autres membres de la famille unix, une commande comme
cat foo* > /tmp/foolist
appellera la fonction main
de cat
avec argv
contenant les correspondances pour foo*
. Le fichier de sortie /tmp/foolist
sera déjà ouvert en tant que stdout
avant que main
soit entré.
VMS ne le fait pas. cat
trouvera la chaîne non développée "foo*"
et l’opérateur de redirection >
dans son argv. Ainsi, l’utilitaire lui-même ( cat
) doit effectuer la redirection (ouverture du fichier de sortie) et le caractère générique (en remplaçant "foo*"
par "foo1", "foo2", "foo3"
). C’est ce que fera initialize_main
sur VMS. Sur unix, il ne fait rien (“Généralement un noop”).
Ceci est laissé par les temps passés. OpenVMS est un système d’exploitation qui a plus ou moins concurrencé Unix dans le passé. Il y a encore pas mal d’OpenVMS en cours d’exécution dans le monde, mais HP a cessé de le prendre en charge et il disparaîtra dans les 10 à 15 prochaines années.
Quoi qu’il en soit, cette fonction est utilisée sur OpenVMS pour permettre la redirection stdout et stderr sur VMS.
Comme cat foo.txt > stuff.txt
sur Unix, la commande cat
ne voit qu’un seul argument foo.txt
, mais sur VMS, qui ne connaît rien du symbole >
, la commande cat
voit 3 arguments.
Le code initialize_main
dans initialize_main
sur VMS permet aux commandes de style unix de base de prendre en charge la redirection de sortie, telle que ls
et
OpenVMS a ensuite ajouté une commande appelée pipe
qui permet à la redirection de fonctionner via n’importe quelle commande.
Vous pouvez afficher le code source pour initialize_main sur VMS ici: Lien