Что делает initialize_main (& argc, & argv)?

Я читаю исходный код ядра, чтобы изучить программирование под Linux.

Я нахожу, что в большинстве программ, таких как ls.c, cat.c, они вызывают макрофункцию initialize_main() в первых нескольких строках. Поэтому я заглянул в system.h, чтобы найти реализацию:

/* 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

Я не понимаю, зачем определять такой макрос, и я не понимаю комментарий.

Ответ 1

Первый шаг в понимании комментария - знать, что такое VMS. Итак, вот ссылка на это: http://en.wikipedia.org/wiki/OpenVMS

Следующим шагом будет понимание перенаправления и подстановки. В Linux и других членах семейства unix команда вроде

cat foo* > /tmp/foolist

вызовет функцию main cat с argv, содержащую совпадения для foo*. Выходной файл /tmp/foolist уже будет открыт как stdout до ввода main.

VMS этого не делает. cat найдет нерасширенную строку "foo*" и оператор перенаправления > в своем argv. Поэтому сама утилита (cat) должна выполнить перенаправление (открытие выходного файла) и подстановочные знаки (заменяя "foo*" на "foo1", "foo2", "foo3"). То, что initialize_main будет делать на VMS. В unix он ничего не сделает ( "Как правило, noop" ).

Ответ 2

Это осталось от времени. OpenVMS - это операционная система, которая ранее конкурировала с Unix в прошлом. В мире по-прежнему остается довольно много OpenVMS, но HP отказалась от поддержки, и она будет уходить в ближайшие 10-15 лет.

Во всяком случае, эта функция используется в OpenVMS, чтобы разрешить перенаправление stdout и stderr на VMS.

Так как cat foo.txt > stuff.txt в Unix, команда cat видит только один аргумент foo.txt, но на VMS, который ничего не знает о символе >, команда cat видит 3 аргумента.

Код внутри initialize_main на VMS позволяет базовым командам стиля unix поддерживать перенаправление вывода, например ls и

OpenVMS позже добавила команду под названием pipe, которая позволяет перенаправлять работу с помощью любой команды.

Здесь вы можете просмотреть исходный код для initialize_main на VMS: Ссылка