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

Управление памятью на уровне пользователя