когда вы выполните программу, то увидите, что все аргументы командной строки обрабатываются автоматически:
$ ./argopt -i -lr 'hi there' -f fred.с -q
option: i
option: l
option: r
filename: fred.c
unknown option: q
argument: hi there
Как это работает
Программа многократно вызывает функцию
getopt
для обработки аргументов-опций до тех пор, пока не останется ни одного, в этот момент
getopt
вернет -1. Для каждой опции выбирается подходящее действие, включая обработку неизвестных опций и пропущенных значений. Если у вас другая версия
getopt
, то вы получите вывод, слегка отличающийся от показанного, — особенно сообщения об ошибках — но смысл будет понятен.
Когда все опции обработаны, программа просто выводит оставшиеся аргументы, как и раньше, но начиная с номера, хранящегося в переменной
optind
.
getopt_long
Многие приложения Linux принимают более информативные аргументы, чем использованные в предыдущем примере односимвольные опции. Библиотека С проекта GNU содержит версию функции
getopt
, названную
getopt_long
, которая принимает так называемые длинные аргументы, которые вводятся с помощью двойного дефиса.
Рассмотрим упражнение 4.3.
Упражнение 4.3. Функция
getopt_long
Примените функцию
getopt_long
для создания новой версии примера программы, которая может вызываться с использованием длинных эквивалентов опций, например, следующих:
На самом деле и новые длинные опции, и исходные односимвольные можно смешивать. Длинным опциям также можно давать сокращенные названия, но они
должны отличаться от односимвольных опций. Длинные опции с аргументом можно задавать как единый аргумент в виде --опция= значение,
как показано далее:
$ ./longopt --init -l --file=fred.с 'hi there'
option: i
option: l
filename: fred.с
argument: hi there
Далее приведена новая программа longopt.c, полученная из программы argopt.c с изменениями, обеспечивающими поддержку длинных опций, которые в тексте программы выделены цветом.
принимает два дополнительных параметра по сравнению с функцией
getopt
. Первый из них — массив структур, описывающий длинные опции и сообщающий функции
getopt_long
способ их обработки. Второй дополнительный параметр — адрес переменной, которая может использоваться как вариант
optind
, предназначенный для длинных опций; для каждой распознанной длинной опции ее номер в массиве длинных опций может быть записан в эту переменную. В данном примере вам не нужна эта информация, поэтому вы используете
NULL
в качестве значения второго дополнительного параметра.