Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
163
К сожалению, функция clearenv() не очень хорошо стандартизирована. Она входит в последние версии POSIX, однако она была выброшена из стандарта Single Unix Standard и не доступна во всех системах типа Unix. Если вам необходимо поддерживать операционную систему, не включающую эту переменную, установите environ=NULL;.
164
Существует еще несколько библиотечных функций, имеющих дело с временными файлами, такие как tmpnam(), tempnam(), mktemp() и tmpfile(). К сожалению, их применение приносит небольшую пользу, поскольку они могут привести к возникновению состязаний в программах, которые невнимательно реализованы.
165
Система Linux позволяет программам открывать очень большое количество файлов. Процессы, работающие как root, могут одновременно открывать сотни файлов, однако большинство дистрибутивов устанавливают предел ресурсов на количество файлов, который может открывать пользовательский процесс. Этот предел также ограничивает максимальный файловый дескриптор, который можно использовать, с помощью метода dup2(), тем самым, предоставляя удобный верхний предел для закрывающего файлового дескриптора.
166
Еще одним способом закрытия всех файлов, открытых программой, является прохождение через каталог файловой системы процесса /proc, в котором перечислены все открытые файлы, и закрытие каждого из них. Каталог /proc/PID/fd (где PID —это pid текущего процесса) содержит символическую ссылку для каждого файлового дескриптора, открытого процессом. Имя каждой символической ссылки представляет собой файловый дескриптор, которому она соответствует. Считывая содержимое каталога, программа легко может закрыть все файловые дескрипторы, которые больше не нужны.
167
Один из авторов этой книги разработал набор инструментальных средств newt для управления окнами на высоком уровне на основе S-Lang; этот набор входит в состав большинства распространяемых дистрибутивов Linux.
168
Как это описано в базе данных terminfo.
169
Ошибка возникает, если получение сигнала происходит в тот момент, когда S-Lang ожидает нажатие клавиши.
170
Помните, что обновление физического терминала производится только с помощью функции SLsmg_refresh().
171
Со временем эта цифра может возрасти, однако маловероятно, что это когда-нибудь будет необходимо.
172
В частности, в некоторых системах это может привести к мерцанию текста.
173
Библиотека Berkley db была существенно расширена, и сейчас включает реализацию B-деревьев и весь спектр работы с транзакциями.
174
В настоящее время Berkley db разрабатывается некоммерческой организацией, которая продает альтернативные лицензии для своей библиотеки, поэтому на них вполне можно ориентироваться при разработке определенного рода приложений.
175
Инвертированные индексы представляют собой структуры данных, предназначенные для полнотекстового поиска.
176
В отличие от некоторых библиотек баз данных, использующих множество файлов с расширениями .pag и .dir, библиотека Depot использует один файл.
177
Хорошее описание хеш-таблиц можно найти в [11].
178
Это значение можно изменить только путем оптимизации базы данных с помощью функции dpoptimize(), описание которой можно найти на Web-сайте qdbm.
179
Несмотря на то что qdbm обеспечивает доступ к файловому дескриптору, использовать его следует осторожно. Дело в том, что все операции по чтению и записи в файл должны производиться через библиотеку qdbm; операции, не связанные с изменением данных в файле, например, блокировка или установка флага для закрытия после выполнения, допускаются.
180
Вернее, они возвращаются в том порядке, в котором производятся ссылки на элементы из хеш-области. Хотя это и есть порядок, он является совершенно бесполезным.
181
Библиотека glibc также предлагает библиотеку argp, с помощью которой можно осуществлять альтернативный вариант проверки синтаксиса параметров.
182
Те, кто знаком с функцией getopt(), заметят, что argInfo является единственным обязательным членом структуры struct poptOption, который отличается от члена в таблице аргументов getoptlong(). Благодаря этому сходству существенно упрощается переход от getoptlong() к popt.
183
Полный исходный код для данного примера можно найти в главе 23.
184
Распространенной ошибкой является определение массива argv как char **, а не как const char **, что является правильным вариантом. Благодаря прототипу функции poptGetContext() компилятор генерирует предупреждающее сообщение, если массив argv будет определен неправильно.
185
Он также добавляет параметр -?, который соответствует --help.
186
Макрос POPT_AUTOHELP расширяется для включения вложенной таблицы параметров, определяющей новые параметры и обратный вызов, при котором реализуются эти параметры.
187
Часто в подобных случаях удобно использовать POPT_CONTEXT_KEEP_FIRST.
188
Первоначально библиотека popt была реализована для RPM, и многие параметры запросов RPM реализованы в виде простых макросов popt.