Что делает 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: Ссылка