Linux программирование в примерах | страница 48
2.5. Резюме
• Программы на С получают аргументы своей командной строки через параметры >argc
и >argv
. Функция >getopt()
предоставляет стандартный способ для последовательного разбора опций и их аргументов GNU версия >getopt()
предоставляет некоторые расширения, a >getopt_long()
и >getopt_long_only()
дает возможность легкого разбора длинных опций.
• Окружение представляет собой набор пар '>имя=значение
', который каждая программа наследует от своего родителя. Программы могут по прихоти своего автора использовать для изменения своего поведения переменные окружения, в дополнение к любым аргументам командной строки. Для получения значений переменных окружения, изменения их значений или удаления существуют стандартные процедуры (>getenv()
, >setenv()
, >putenv()
и >unsetenv()
). При необходимости можно получить доступ ко всему окружению через внешнюю переменную >environ
или через третий аргумент >char **envp
функции >main()
. Последний способ не рекомендуется.
Упражнения
1. Предположим, что программа принимает опции >-a
, >-b
и >-с
, и что >-b
требует наличия аргумента. Напишите для этой программы код ручного разбора аргументов без использования >getopt()
или >getopt_long()
. Для завершения обработки опций принимается >--
. Убедитесь, что -ас работает, также, как >-bYANKEES
, >-b YANKEES
и >-abYANKEES
. Протестируйте программу.
2. Реализуйте >getopt()
. Для первой версии вы можете не беспокоиться насчет случая '>optstring[0] == ':'
'. Можете также игнорировать >opterr
.
3. Добавьте код для '>optstring[0] == ':'
' и >opterr
к своей версии >getopt()
.
4. Распечатайте и прочтите файлы GNU >getopt.h
, >getopt.с
и >getopt1.с
.
5. Напишите программу, которая объявляет как >environ
, так и >envp
, и сравните их значения.
6. Разбор аргументов командной строки и опций является тем колесом, которое многие люди не могут не изобретать вновь. Вы можете захотеть познакомиться с различными анализирующими аргументы пакетами, помимо >getopt()
и >getopt_long()
, такими, как:
• библиотека анализа аргументов Plan 9 From Bell Labs arg(2)[31],
• Argp[32],
• Argv[33],
• Autoopts[34],
• GNU Gengetopt[35],
• Opt[36],
• Popt[37]. См. также справочную страницу popt(3) системы GNU/Linux.
7. Дополнительный балл, почему компилятор С не может полностью игнорировать ключевое слово register? Подсказка: какие действия невозможно совершать с регистровой переменной?
Глава 3
Управление памятью на уровне пользователя