Программирование для Linux. Профессиональный подход
Шрифт:
Список возможных длинных опций задается в виде массива структур
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.2. (getopt_long.c) Использование функции
getopt_long
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
/* Имя программы. */
const char* program_name;
/* Вывод информации об использовании программы в поток STREAM
(обычно stdout или stderr) и завершение работы с выдачей кода
EXIT_CODE. Возврат в функцию main не происходит */
void print_usage(FILE* stream, int exit_code) {
fprintf(stream, "Usage: %s options [ inputfile ... ]\n",
program_name);
fprintf(stream,
" -h --help Display this usage
information.\n"
" -о --output filename Write output to file.\n"
" -v --verbose Print verbose messages.\n");
exit(exit_code);
}
/*
Точка входа в основную программу, параметр ARGC содержит размер
списка аргументов; параметр ARGV -- это массив указателей
на аргументы. */
int main(int argc, char* argv[]) (
int next_option;
/* Строка с описанием возможных коротких опций. */
const char* const short_options = "ho:v";
/* Массив с описанием возможных длинных опций. */
const struct option long_options[] = {
{ "help", 0, NULL, 'h' },
{ "output", 1, NULL, 'o' },
{ "verbose", 0, NULL, 'v' },
{ NULL, 0, NULL, 0 } /* Требуется в конце массива. */
};
/* Имя файла, в который записываются результаты работы
программы, или NULL, если вывод направляется в поток
stdout. */
const char* output_filename = NULL;
/* Следует ли выводить развернутые сообщения. */
int verbose = 0;
/* Запоминаем имя программы, которое будет включаться
в сообщения. Оно хранится в элементе argv[0] */
program_name = argv[0];
do {
next_option =
getopt_long(argc, argv, short_options,
long_options, NULL);
switch(next_opt ion) {
case "h": /* -h или --help */
/* Пользователь запросил информацию об использовании
программы, нужно вывести ее в поток stdout и завершить
работу с выдачей кода 0 (нормальное завершение). */
print_usage(stdout, 0);
case 'o': /* -о или --output */
/* Эта опция принимает аргумент -- имя выходного файла. */
Поделиться:
Популярные книги
Метатель
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Магия чистых душ
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Барон Дубов
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Попытка возврата. Тетралогия
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Долгий путь домой
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Гардемарин Ее Величества. Инкарнация
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Завод-3: назад в СССР
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Камень. Книга пятая
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Отдельный танковый
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Метатель. Книга 3
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Боярышня Евдокия
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00