Книга: Программирование для Linux. Профессиональный подход
2.1.3. Функция getopt_long()
2.1.3. Функция getopt_long()
Синтаксический анализ аргументов командной строки — утомительная задача. К счастью. в GNU-библиотеке языка С есть функция getopt_long()
, упрощающая ее решение. Эта функция понимает как короткие, так и длинные опции. Ее объявление находится в файле <getopt.h>
.
Предположим, требуется написать программу, которая поддерживает три опции (табл. 2.1).
Таблица 2.1. Опции тестовой программы
Короткая форма | Длинная форма | Назначение |
---|---|---|
-h |
--help |
Отображение справки по использованию программы и выход |
-o имя_файла |
--output имя_файла |
Задание имени выходного файла |
-v |
--verbose |
Отображение развернутых сообщений |
Кроме того, программе могут быть переданы дополнительные аргументы, задающие имена входных файлов
Функции getopt_long()
нужно передать две структуры. Первая — это строка с описанием возможных коротких опций (каждая из них представлена одной буквой). Если опция предполагает наличие аргумента, после нее ставится двоеточие. В нашем случае строка будет иметь вид ho:v
. Это говорит о том, что программа поддерживает опции -h
, -о
и -v
, причем для второй из них требуется аргумент.
Список возможных длинных опций задается в виде массива структур option
. Каждый элемент массива соответствует одной опции и состоит из четырех полей. Чаще всего первое поле содержит имя опции (строка символов без ведущих дефисов), второе — 1, если опция принимает аргумент, и 0 — в противном случае: третье — NULL
; четвертое — символьная константа, задающая короткий эквивалент данной длинной опции. Последний элемент массива должен содержать одни нули. Наш массив будет выглядеть так:
const struct option long_options[] = {
{ "help", 0, NULL, 'h' },
{ "output", 1, NULL, 'o' },
{ "verbose", 0, NULL, 'v' },
{ NULL, 0, NULL, 0 }
};
Функции getopt_long()
передаются также параметры argc
и argv
функции main()
. Ниже перечислены особенности ее работы.
? При каждом вызове функция getopt_long()
анализирует очередную опцию, возвращая букву, которая соответствует короткому эквиваленту опции. При отсутствии опций возвращается -1.
? Обычно функция getopt_long()
вызывается в цикле для обработки всех опций командной строки. Выбор конкретной опции осуществляется посредством конструкции switch
.
? Если опция getopt_long()
обнаруживает неправильную опцию (т.е. она не указана в списке коротких и длинных опций), она выводит сообщение об ошибке и возвращает символ ?
(знак вопроса). В ответ на это большинство программ завершает свою работу, обычно отображая справку по работе с программой.
? При обработке опции, имеющей аргумент, в глобальную переменную optarg
помещается указатель на строку с содержимым аргумента.
? Когда функция getopt_long()
завершает анализ опций, в глобальную переменную optind
записывается индекс того элемента массива argv
, в котором содержится первый аргумент, не являющийся опцией.
В листинге 2.2 приведен пример обработки аргументов программы с помощью функции getopt_long()
.
- 2.3. Разбор опций: getopt() и getopt_long()
- 16.2. Неблокируемые чтение и запись: функция str_cli (продолжение)
- Булевые функции Функция boolean
- Функция strcpy( )
- getopt_long
- Функция zip() в Python:
- Листинг 11.5. (main.c) Главная серверная функция, выполняющая анализ аргументов командной строки
- 19.6.3. Функция jQuery.ajax()
- 9.7. Функция sctp_getladdrs
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- Функция strcmp( )