Que fait initialize_main (& argc, & argv)?

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