Программирование для 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.00
рейтинг книги
Мастер 2
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Нечто чудесное
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Клан
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Имя нам Легион. Том 3
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Запасная дочь
Фантастика:
фэнтези
6.40
рейтинг книги
Убивать чтобы жить 7
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
У врага за пазухой
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
Кодекс Охотника. Книга XXI
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Генерал Скала и ученица
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Оцифрованный. Том 1
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Его маленькая большая женщина
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Хуррит
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00