2013-10-09 4 views
11

Я читаю исходный код ядра, чтобы изучить программирование под Linux.Что делает initialize_main (& argc, & argv)?

Я нахожу, что в большинстве программ, таких как 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 

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

+0

, если вы наблюдаете, где и как эти макросы используют в том, что файлы, которые вы бы узнали. – Gangadhar

+2

Комментарий объясняет это достаточно хорошо «Вообще нооп, но используется, в частности, для родной VMS». Итак, под linux, это nop, ничего. VMS, вероятно, делает что-то другое для обработки аргументов. Linux не является VMS. –

+0

@CharlieBurns Спасибо большое, получил его сейчас. – f00l

ответ

16

Первый шаг в понимании комментария - знать, что такое 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»).

+0

Черт, побей меня :) – Salgar

7

Это осталось от времени. 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 здесь: Link