Linux программирование в примерах - Роббинс Арнольд
Шрифт:
Интервал:
Закладка:
На практике это означает, что вы сами почти никогда не будете вызывать tzset(). Но если понадобится, эта функция есть.
6.1.5.1. Системы BSD: timezone(), не timezone
Некоторые производные от BSD 4.4 системы вместо переменной POSIX timezone предоставляют функцию timezone():
#include <time.h> /* BSD */
char *timezone(int zone, int dst);
Аргумент zone является числом минут западнее GMT, a dst истинно, если действует летнее время. Возвращаемое значение является строкой, дающей имя указанного часового пояса, или значение, выраженное относительно GMT. Эта функция обеспечивает совместимость с функцией V7 с тем же именем и поведением.
Локальное время: откуда оно известно?Системы GNU/Linux хранят информацию о часовых поясах в файлах и каталогах в /usr/share/zoneinfo:
$ <b>cd /usr/share/zoneinfo</b>
$ <b>ls -FC</b>
Africa/ Canada/ Factory Iceland MST7MDT Portugal W-SU
America/ Chile/ GB Indian/ Mexico/ ROC WET
Antarctica/ Cuba GB-Eire Iran Mideast/ ROK Zulu
Arctic/ EET GMT Israel NZ Singapore iso3166.tab
Asia/ EST GMT+0 Jamaica NZ-CHAT SystemV/ posix/
Atlantic/ EST5EDT GMT-0 Japan Navajo Turkey posixrules
Australia/ Egypt GMT0 Kwajalein PRC UCT right/
Brazil/ Eire Greenwich Libya PST8PDT US/ zone.tab
CET Etc/ HST MET Pacific/ UTC
CST6CDT Europe/ Hongkong MST Poland Universal
Когда возможно, этот каталог использует прямые ссылки для предоставления одних и тех же данных с разными именами. Например, файлы EST5EDT и US/Eastern на самом деле одни и те же:
$ <b>ls -il EST5EDT US/Eastern</b>
724350 -rw-r--r-- 5 root root 1267 Sep б 2002 EST5EDT
724350 -rw-r--r-- 5 root root 1267 Sep 6 2002 US/Eastern
Частью установки системы является выбор часового пояса. Надлежащий файл данных часового пояса помещается затем в /etc/localtime:
$ <b>file /etc/localtime</b>
/etc/localtime: timezone data
На нашей системе это автономная копия файла для нашего часового пояса. На других системах это может быть символическая ссылка на файл в /usr/share/zoneinfo. Преимуществом использования отдельной копии является то, что все по-прежнему работает, если /usr не смонтирован.
Переменная окружения TZ, если она установлена, перекрывает значение по умолчанию для часового пояса:
$ <b>date</b> /* Дата и время в часовом поясе по умолчанию
*/
Wed Nov 19 06:44:50 EST 2003
$ <b>export TZ=PST8PDT</b> /* Смена часового пояса на Западное
побережье США */
$ <b>date</b> /* Вывести дату и время */
Wed Nov 19 03:45:09 PST 2003
Широкое распространение этой функции делает переносимое использование переменной POSIX timezone трудной. К счастью, мы не видим большой потребности в ней strftime() должно быть достаточно едва ли не для большинства необычных потребностей
6.2. Функции сортировки и поиска
Сортировка и поиск являются двумя фундаментальными операциями, потребность в которых постоянно возникает во многих приложениях Библиотека С предоставляет ряд стандартных интерфейсов для осуществления этих задач.
Все процедуры разделяют общий лейтмотив; данные управляются через указатели void*, а сортировку осуществляют предоставленные пользователем функции. Обратите также внимание, что эти API применяются к данным в памяти. Структуры сортировки и поиска в файлах значительно более сложны и выходят за рамки вводного руководства, подобного данному. (Однако, команда sort хорошо работает для текстовых файлов; см. справочную страницу для sort(1). Сортировка двоичных файлов требует написания специальной программы.)
Поскольку ни один алгоритм не работает одинаково хорошо для всех приложений, имеются несколько различных наборов библиотечных процедур для сопровождения искомых коллекций данных. Данная глава рассматривает лишь один простой интерфейс для поиска. Другой, более развитый интерфейс описан в разделе 14.4 «Расширенный поиск с использованием двоичных деревьев». Более того, мы намеренно не объясняем лежащие в основе алгоритмы, поскольку данная книга об API, а не об алгоритмах и структурах данных. Важно понять, что API можно рассматривать как «черные ящики», выполняющие определенную работу без необходимости понимания подробностей их работы.
6.2.1. Сортировка: qsort()
Сортировка выполняется с помощью qsort():
#include <stdlib.h> /* ISO С */
void qsort(void *base, size_t nmemb, size_t size,
int (*compare)(const void*, const void*));
Название qsort() происходит от алгоритма машинного поиска Хоара Quicksort (C.A.R. Hoare's Quicksort algorithm), который использовался в первоначальной реализации Unix. (Ничто в стандарте POSIX не требует использования этого алгоритма для qsort(). Реализация GLIBC использует высоко оптимизированную комбинацию Quicksort и Insertion Sort.)
qsort() сортирует массивы произвольных объектов. Она работает, перетасовывая непрозрачные участки памяти из одного места массива в другой и полагаясь на то, что вы, программист, предоставите функцию сравнения, которая позволяет определить относительное расположение одного элемента массива относительно другого. Аргументы следующие:
void *base
Адрес начала массива.