На эту книгу обычно ссылаются как на последнее слово в сортировке и поиске. Примите во внимание, что она значительно более сжата и труднее для чтения, чем книга Loudon'a.

3. Проект GTK+[72] состоит из нескольких совместно работающих библиотек GTK+ является лежащим в основе инструментарием, используемым проектом GNU GNOME.[73] В основе иерархии библиотек располагается Glib, библиотека фундаментальных типов, структур данных и функций для работы с ними. Glib включает возможности для всех основных операций, которые мы до сих пор рассмотрели в данной книге, и многое другое, включая связанные списки и хэш-таблицы. Для просмотра онлайн-документов начните с веб-сайта проекта документации GTK+[74], щелкните на ссылке «Загрузить» (Download) и идите дальше по онлайн-версии.

<p>6.6. Резюме</p>

• Время внутренне хранится в виде значений time_t, представляющих «секунды с начала Эпохи». Эпоха для систем GNU/Linux и Unix начинается с полночи 1 января 1970 г. по UTC. Текущее время получается от системы с помощью системного вызова time(), а difftime() возвращает разницу в секундах между двумя значениями time_t.

• Структура struct tm представляет «разложенное время», которое является значительно более удобным представлением даты и времени. gmtime() и localtime() преобразуют значения time_t в значения struct tm, a mktime() действует в обратном направлении.

• asctime() и ctime() осуществляют упрошенное форматирование значений времени, возвращая указатель на static строку символов фиксированного размера и формата, strftime() предусматривает гораздо более гибкое форматирование, включая значения на основе местных настроек.

• Сведения о часовом поясе доступны через вызов tzset(). Поскольку стандартные процедуры действуют так, как если бы они автоматически вызывали tzset(), необходимость в непосредственном вызове этой функции возникает редко.

• Стандартной процедурой для сортировки массивов является qsort(). Используя предоставленную пользователем функцию сравнения и принимая параметры числа элементов массива и их размера, qsort() может сортировать любые виды данных. Это обеспечивает значительную гибкость.

• scandir() читает в массив struct dirent каталог целиком. Для выбора того, какие элементы включить в массив и для обеспечения упорядочения элементов в массиве могут использоваться предоставленные пользователем функции alphasort() является стандартной функцией для сортировки элементов каталога по имени; scandir() передает функцию сортировки прямо через qsort().

• Функция bsearch() работает подобно qsort(). Она осуществляет быстрый бинарный поиск. Используйте ее, если цена линейного поиска перевешивает цену сортировки ваших данных. (Дополнительный API для поиска коллекций данных описан в разделе 14.4 «Расширенный поиск с помощью двоичных деревьев».)

• Базы данных пользователей и групп могут храниться в файлах на локальном диске или могут быть доступны через сеть. Стандартный API намеренно скрывает это различие. Каждая база данных обеспечивает как линейный просмотр всей базы данных, так и непосредственные запросы имени или ID пользователя/группы.

• Наконец, для тех случаев, когда недостаточно простого stat(), isatty() может вам сообщить, представляет ли открытый файл устройство терминала.

<p>Упражнения</p>

1. Напишите простую версию команды date, которая принимает в командной строке строку формата и использует ее для форматирования и вывода текущего времени.

2. Когда файл старше шести месяцев, 'ls -l' использует для печати времени изменения более простой формат. GNU версия файла ls.c использует следующее вычисление:

3043 /* Время считается недавним, если оно в пределах последних 6

3044    месяцев. В Григорианском годе 365.2425 * 24 * 60 * 60 ==

3045    31556952 секунд в среднем. Запишите это значение как

3046    целую константу для избежания трудностей с плавающей точкой.*/

3047    six_months_ago = current_time - 31556952 / 2;

Сравните это с нашим примером вычисления шести прошлых месяцев. Каковы преимущества и недостатки каждого из методов?

3. Напишите простую версию команды touch, которая изменяет время модификации файла, имя которого указано в командной строке, на текущее время

4. Добавьте к вашей команде touch опцию, которая принимает в командной строке значения даты и времени и использует их в качестве нового времени модификации файлов, указанных в командной строке.

Перейти на страницу:

Похожие книги