Чтение онлайн

на главную

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

193 if (optind == argc)

194 {

195 while (*environ)

196 puts (*environ++);

197 exit(EXIT_SUCCESS);

198 }

Строки 174–179 переносят существующие переменные в новую копию окружения. В глобальную переменную

environ
помещается указатель на пустой локальный массив. Параметр
envp
поддерживает доступ к первоначальному окружению.

Строки 181–184 удаляют переменные окружения, указанные в опции

– u
. Программа осуществляет это, повторно сканируя командную строку и удаляя перечисленные там имена. Удаление переменных окружения основывается на обсуждавшейся ранее особенности GNU
putenv
: при вызове с одним лишь именем переменной (без указанного
значения)
putenv
удаляет ее из окружения.

После опций в командной строке помещаются новые или замещающие переменные окружения. Строки 189–190 продолжают сканирование командной строки, отыскивая установки переменных окружения в виде '

имя=значение
'.

По достижении строки 192, если в командной строке ничего не осталось, предполагается, что

env
печатает новое окружение и выходит из программы. Она это и делает (строки 195–197).

Если остались аргументы, они представляют имя команды, которую нужно вызвать, и аргументы для передачи этой новой команде. Это делается с помощью системного вызова

execvp
(строка 200), который замещает текущую программу новой. (Этот вызов обсуждается в разделе 9.1.4 «Запуск новой программы: семейство
exec
»; пока не беспокойтесь о деталях.) Если этот вызов возвращается в текущую программу, он потерпел неудачу. В таком случае
env
выводит сообщение об ошибке и завершает программу.

200 execvp(argv[optind], &argv[optind]);

201

202 {

203 int exit_status = (errno == ENOENT ? 127 : 126);

204 error(0, errno, "%s", argv[optind]);

205 exit(exit_status);

206 }

207 }

Значения кода завершения

126
и
127
(определяемые в строке 203) соответствуют стандарту POSIX.
127
означает, что программа, которую
execvp
попыталась запустить, не существует. (
ENOENT
означает, что файл не содержит записи в каталоге.)
126
означает, что файл существует, но была какая-то другая ошибка.

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] ,

31

http://plan9.bell-labs.com/magic/man2html/2/arg
Примеч. автора.

32

http://www.gnu.org/manual/glibc/html_node/Argp.html
Примеч. автора.

33

http://256.com/sources/argv
Примеч. автора.

 • Autoopts [34] ,

 • GNU Gengetopt [35] ,

 • Opt [36] ,

 • Popt [37] . См. также справочную страницу popt(3) системы GNU/Linux.

7. Дополнительный балл, почему компилятор С не может полностью игнорировать ключевое слово register? Подсказка: какие действия невозможно совершать с регистровой переменной?

34

http://autogen.sourceforge.net/autoopts.html
Примеч. автора.

35

ftp://ftp.gnu.org/gnu/gengetopt/
Примеч. автора.

36

http://nis-www.lanl.gov/~jt/Software/opt/opt-3.19.tar.gz
Примеч. автора.

37

http://freshmeat.net/projects/popt/?topic_id=809
Примеч. автора.

Глава 3

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

Без памяти для хранения данных программа не может выполнить никакую работу (Или, скорее, невозможно выполнить никакую полезную работу.) Реальные программы не могут позволить себе полагаться на буферы и массивы структур данных фиксированного размера. Они должны быть способны обрабатывать вводимые данные различных размеров, от незначительных до больших. Это, в свою очередь, ведет к использованию динамически выделяемой памяти — памяти, выделяемой в ходе исполнения, а не при компиляции. Вот как вводится в действие принцип GNU «никаких произвольных ограничений».

Поскольку динамически выделяемая память является основным строительным блоком для реальных программ, мы рассмотрим этот вопрос в начале, до рассмотрения всего остального. Наше обсуждение фокусируется на рассмотрении процесса и его памяти исключительно на уровне пользователя; оно не имеет ничего общего с архитектурой процессора.

3.1. Адресное пространство Linux/Unix

В качестве рабочего определения мы приняли, что процесс является запушенной программой. Это означает, что операционная система загрузила исполняемый файл для этой программы в память, сделала доступными аргументы командной строки и переменные окружения и запустила ее. Процесс имеет пять выделенных для него концептуально различных областей памяти:

Поделиться:
Популярные книги

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Идеальный мир для Социопата 4

Сапфир Олег
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Идеальный мир для Социопата 4

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Книга пяти колец. Том 2

Зайцев Константин
2. Книга пяти колец
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Книга пяти колец. Том 2

Вечная Война. Книга VII

Винокуров Юрий
7. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
5.75
рейтинг книги
Вечная Война. Книга VII

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Месть Паладина

Юллем Евгений
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Месть Паладина