Книга: Программирование для Linux. Профессиональный подход
Листинг 2.2. (getopt_long.c) Использование функции 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 */
/* Эта опция принимает аргумент -- имя выходного файла. */
output_filename = optarg;
break;
case 'v': /* -v или --verbose */
verbose = 1;
break;
case '?': /* Пользователь ввел неверную опцию. */
/* Записываем информацию об использовании программы в поток
stderr и завершаем работу с выдачей кода 1
(аварийное завершение). */
print_usage(stderr, 1);
case -1: /* Опций больше нет. */
break;
default: /* Какой-то непредвиденный результат. */
abort();
}
}
while (next_option != -1);
/* Обработка опций завершена, переменная OPTIND указывает на
первый аргумент, не являющийся опцией. В демонстрационных
целях отображаем эти аргументы, если задан режим VERBOSE. */
if (verbose) {
int i;
for (i = optind; i < argc; ++i)
printf("Argument: %sn", argv[i]);
}
/* Далее идет основное тело программы... */
return 0;
}
Может показаться, что использование функции getopt_long()
приводит к написанию громоздкого кода, но, поверьте, самостоятельный синтаксический анализ опций командной строки — гораздо более трудоемкая задача. Функция getopt_long()
достаточно универсальна и гибка в работе с опциями, но лучше не заниматься сложными вещами. Старайтесь придерживаться традиционной структуры задания опций.
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление с использованием инструмента gbak
- 2.1.3. Функция getopt_long()
- Типы страниц и их использование
- Использование констант
- Аргументы функции в Python
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса
- Использование CAST() с типами дата
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Использование типов содержимого и столбцов