Получение сведений о часовом поясе — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Получение сведений о часовом поясе

2021-01-29 92
Получение сведений о часовом поясе 0.00 из 5.00 0 оценок
Заказать работу

 

На ранних системах Unix сведения о часовом поясе внедрялись в ядро при компиляции. Правила перехода на летнее время обычно были жестко вшиты в код, что создавало трудности для пользователей вне Соединенных Штатов или в местах внутри Соединенных Штатов, в которых не осуществлялся переход на летнее время.

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

Интерфейс языка С для сведений о часовых поясах развивался в разных версиях Unix, как на System V, так и Berkley, пока, наконец, не был стандартизован POSIX следующим образом.

 

Функция проверяет переменную окружения для получения сведений о часовом поясе и переходе на летнее время.[65] Если эта переменная не установлена, использует «определенный в реализации часовой пояс по умолчанию», который скорее всего является часовым поясом машины, на которой вы работаете.

После вызова сведения о локальном часовом поясе доступны в нескольких переменных:

 

Стандартное имя и имя летнего времени для часового пояса. Например, для областей США в восточном часовом поясе именами часового пояса являются 'EST' (Eastern Standard Time) и 'EDT' (Eastern Daylight Time).

 

Разница в секундах между текущим часовым поясом и UTC. Стандарт не определяет, как эта разница работает. На практике отрицательные значения представляют часовые пояса восточнее (перед, или те, которые позже) UTC; положительные значения представляют часовые пояса западнее (за, или те, которые раньше) UTC. Если вы посмотрите на это значение как «насколько изменить местное время, чтобы оно стало равно UTC», тогда знак этого значения имеет смысл.

 

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

 

ЗАМЕЧАНИЕ. Переменная не означает, действует ли в настоящий момент летнее время! Вместо этого она просто констатирует, может ли текущий часовой пояс вообще иметь летнее время.

 

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

На практике это означает, что вы сами почти никогда не будете вызывать. Но если понадобится, эта функция есть.

 

Системы BSD:, не

 

Некоторые производные от BSD 4.4 системы вместо переменной POSIX предоставляют функцию:

 

 

Аргумент является числом минут западнее GMT, a истинно, если действует летнее время. Возвращаемое значение является строкой, дающей имя указанного часового пояса, или значение, выраженное относительно GMT. Эта функция обеспечивает совместимость с функцией V7 с тем же именем и поведением.

 

 

Локальное время: откуда оно известно?

Системы GNU/Linux хранят информацию о часовых поясах в файлах и каталогах в:

Cd /usr/share/zoneinfo

ls ‑FC

 

 

Когда возможно, этот каталог использует прямые ссылки для предоставления одних и тех же данных с разными именами. Например, файлы и на самом деле одни и те же:

ls ‑il EST5EDT US/Eastern

 

 

Частью установки системы является выбор часового пояса. Надлежащий файл данных часового пояса помещается затем в:

File /etc/localtime

 

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

Переменная окружения, если она установлена, перекрывает значение по умолчанию для часового пояса:

Date

 

 

export TZ=PST8PDT

 

Date

 

 

Широкое распространение этой функции делает переносимое использование переменной POSIX трудной. К счастью, мы не видим большой потребности в ней должно быть достаточно едва ли не для большинства необычных потребностей

 

Функции сортировки и поиска

 

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

Все процедуры разделяют общий лейтмотив; данные управляются через указатели, а сортировку осуществляют предоставленные пользователем функции. Обратите также внимание, что эти API применяются к данным в памяти. Структуры сортировки и поиска в файлах значительно более сложны и выходят за рамки вводного руководства, подобного данному. (Однако, команда хорошо работает для текстовых файлов; см. справочную страницу для sort (1). Сортировка двоичных файлов требует написания специальной программы.)

Поскольку ни один алгоритм не работает одинаково хорошо для всех приложений, имеются несколько различных наборов библиотечных процедур для сопровождения искомых коллекций данных. Данная глава рассматривает лишь один простой интерфейс для поиска. Другой, более развитый интерфейс описан в разделе 14.4 «Расширенный поиск с использованием двоичных деревьев». Более того, мы намеренно не объясняем лежащие в основе алгоритмы, поскольку данная книга об API, а не об алгоритмах и структурах данных. Важно понять, что API можно рассматривать как «черные ящики», выполняющие определенную работу без необходимости понимания подробностей их работы.

 

Сортировка:

 

Сортировка выполняется с помощью:

 

 

Название происходит от алгоритма машинного поиска Хоара Quicksort (C.A.R. Hoare's Quicksort algorithm), который использовался в первоначальной реализации Unix. (Ничто в стандарте POSIX не требует использования этого алгоритма для. Реализация GLIBC использует высоко оптимизированную комбинацию Quicksort и Insertion Sort.)

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

 

Адрес начала массива.

 

Общее число элементов в массиве.

 

Размер каждого элемента массива. Лучший способ получения этого значения – оператор С.

 

Возможно устрашающее объявление указателя функции. Оно говорит, что «указывает на функцию, которая принимает два параметра '' и возвращает».

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

 

Это показывает общий стереотип для функций сравнения: привести тип аргументов от к указателям на сравниваемый тип, а затем вернуть результат сравнения.

Для чисел с плавающей точкой простое вычитание, подобное '', не работает, особенно если одно значение очень маленькое или одно или оба значения являются специальными значениями «не число» или «бесконечность». Поэтому нам приходится осуществлять сравнение вручную, принимая во внимание нечисловое значение (которое даже не равно самому себе!)

 

Пример: сортировка сотрудников

 

Для более сложных структур требуются более сложные функции. Например, рассмотрите следующую (довольно тривиальную):

 

 

Мы могли бы написать функцию для сортировки сотрудников по фамилии, имени и идентификационному номеру:

 

 

Логика здесь проста: сначала сравниваются фамилии, затем имена, а затем номера ID, если два имени совпадают. Используя для строк, мы автоматически получаем правильное отрицательное/нулевое/положительное значение для возвращения.

При сравнении ID сотрудников нельзя просто использовать вычитание: представьте, что 64‑разрядный, а 32‑разрядный, а два значения отличаются лишь в старших 32 битах (скажем, младшие 32 бита равны нулю). В таком случае вычитание автоматически привело бы к приведению типа к с отбрасыванием старших 32 битов и возвращением неверного результата.

 

ЗАМЕЧАНИЕ. Возможно, мы остановились при сравнении имен, в этом случае все сотрудники с совпадающими фамилиями и именами оказались бы сгруппированы, но никак не отсортированы

Это важный момент не гарантирует стабильной сортировки. Стабильна сортировка, в которой, если два элемента равны на основе значения какого‑либо ключа(‑ей), они сохраняют свой первоначальный порядок друг относительно друга в конечном отсортированном массиве. Например, рассмотрите трех сотрудников с одинаковыми фамилиями и именами и с номерами 17, 42 и 81. Их порядок в первоначальном массиве. возможно, был 42, 81 и 17 (Что означает, что сотрудник 42 находится по индексу с меньшим значением, чем сотрудник 81, который, в свою очередь, находится по индексу с меньшим значением, чем сотрудник 17). После сортировки порядок может оказаться 81, 42 и 17. Если ото представляет проблему, процедура сравнения должна рассматривать все важные ключевые значения (Наша так и делает.)

 

Просто используя другую функцию, мы можем отсортировать сотрудников по старшинству:

 

 

Для максимальной переносимости мы использовали, которая возвращает разницу в секундах между двумя значениями. Для данного конкретного случая приведение, такое, как

 

должно сработать, поскольку значения находятся в приемлемом диапазоне. Тем не менее, мы вместо этого использовали полный трехсторонний оператор, просто из предосторожности.

Вот пример файла данных со списком пяти президентов США:

Cat presdata.txt

 

 

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

 

 

Строки 70–77 считывают данные. Обратите внимание, что любое использование требует от входных данных «хорошего поведения». Если, например, какое‑нибудь имя содержит более 29 символов, возникает проблема. В данном случае, мы вне опасности, но в коде изделия нужно быть гораздо более осмотрительным.

Строка 82 сортирует данные по имени и по ID сотрудника, а затем строки 84–91 выводят отсортированные данные. Сходным образом строка 94 пересортировывает данные, на этот раз по старшинству, а строки 97–103 выводят результаты. После компилирования и запуска программа выдает следующие результаты:

ch06‑sortemp < presdata.txt

 

 

(Мы использовали 1 час пополудни как приблизительное время, когда все президенты начали работать.)[66]

Стоит заметить одну вещь: переставляет данные в массиве. Если каждый элемент массива представляет собой большую структуру, при сортировке массива большое количество данных будут копироваться туда‑сюда. Вместо этого может оказаться выгодным создать отдельный массив указателей, каждый из которых указывает на один элемент массива. Затем использовать для сортировки массива указателей, получая доступ к несортированным данным через сортированные указатели.

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

 

ЗАМЕЧАНИЕ. Если вы являетесь программистом С++, знайте! может быть опасной для использования с массивами объектов! осуществляет простые перемещения памяти, копируя байты. Она совершенно ничего не знает о конструкциях С++, таких, как конструкторы копирования или функции. Вместо этого используйте одну из функций сортировки STL[67] или используйте методику отдельного массива указателей.

 

 

Пример: сортировка содержимого каталога

 

В разделе 5.3 «Чтение каталогов» мы продемонстрировали, как элементы каталогов возвращаются в физическом порядке каталога. В большинстве случаев гораздо полезнее иметь содержимое каталога отсортированным каким‑нибудь образом, например, по имени или по времени изменения. Хотя и не стандартизованные POSIX, несколько процедур упрощают это, используя в качестве лежащего в основе сортирующего агента:

 

Функции и были сделаны доступными в 4.2 BSD и широко поддерживаются[68], является расширением GNU.

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

Для выбора нужных элементов используйте указатель функции. Когда это значение равно, все действительные элементы каталога включаются в конечный массив. В противном случае вызывается для каждого элемента, и те элементы, для которых она возвращает ненулевое (истинное) значение, включаются в массив.

Указатель функции compare сравнивает два элемента каталога. Он передается функции для использования при сортировке.

 лексикографически сравнивает имена файлов. Она использует для сравнения функцию. похожа на, но учитывает связанные с местной спецификой правила сортировки (см. раздел 13.4 «Не могли бы вы написать это для меня по буквам?»).

 является расширением GNU, которое использует для сравнения имен файлов функцию GNU (см. strverscmp (3).) Короче говоря, эта функция понимает обычные соглашения по версиям имен файлов и сравнивает их соответствующим образом.

В приведена программа, похожая на. Однако, она использует для работы и.

 

Функция программы (строки 1–27) следует стандартному шаблону, который мы использовали до этого. Функция (строки 31–35) действует как параметр, выбирая лишь имена файлов, которые не начинаются с точки.

Функция (строки 43–65) довольно проста, причем делает большую часть работы. Обратите внимание, как каждый элемент отдельно освобождается с помощью (строка 59) и как освобождается также весь массив (строка 62).

При запуске содержимое каталога в самом деле выводится в отсортированном порядке, без '' и ''.

 

 

Бинарный поиск:

 

Линейный поиск в значительной степени похож на свое название: вы начинаете в начале и проходите искомый массив, пока не встретите то, что нужно. Для чего‑нибудь простого, типа поиска целых, это обычно принимает форму цикла. Рассмотрите эту функцию:

 

 

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

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

В отличие от линейного, бинарный поиск требует, чтобы входной массив был уже отсортирован. Недостатком здесь является то, что если добавляются элементы, массив перед новым поиском нужно повторно отсортировать. (Когда элементы удаляются, остальное содержимое массива все равно должно быть перетасовано. Это не так дорого, как повторная сортировка, но все равно может потребовать большого перемещения данных.)

Преимуществом бинарного поиска, и значительным, является то, что бинарный поиск умопомрачительно быстр, требуя самое большее log2(N) сравнений, где N является числом элементов в массиве. Функция объявлена следующим образом:

 

 

Параметры и их назначение сходны с таковыми для:

 

Объект, который ищется в массиве.

 

Начало массива.

 

Число элементов в массиве.

 

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

 

Функция сравнения. Она должна работать таким же образом, как функция сравнения для, возвращая отрицательные/нулевые/положительные значения в соответствии с тем, меньше/равен/больше первый параметр по сравнению со вторым.

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

 показывает на практике, расширяя использованный ранее пример:

 

Строки 7–12 определяют; она та же, что и раньше. Строки 16–29 служат в качестве функции сравнения как для, так и для. Они сравнивают лишь ID сотрудников. Строки 33–37 определяют, которая является удобной функцией для печати структуры, поскольку это делается из разных мест.

 

 

Функция начинается с проверки аргументов (строки 52–55). Затем она читает данные из указанного файла (строки 57–72). Стандартный ввод для данных сотрудников использоваться не может, поскольку он зарезервирован для запроса у пользователя ID искомого сотрудника.

Строки 77–84 сортируют, а затем печатают данные. Затем программа входит в цикл, начинающийся со строки 86. Она запрашивает идентификационный номер сотрудника, выходя из цикла по достижению конца файла. Для поиска в массиве мы используем с именем. Достаточно лишь установить в его поле emp_id введенный номер ID; другие поля при сравнении не используются (строка 92).

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

ch06‑searchemp presdata.txt

 

 

42

 

29

 

40

 

^D

 

Дополнительный, более продвинутый API для поиска коллекций данных описан в разделе 14.4 «Расширенный поиск с использованием двоичных деревьев».

 

 

Имена пользователей и групп

 

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

Ранние системы Unix хранили информацию, сопоставляющую имена с номерами ID, в простых текстовых файлах и. На современных системах эти файлы до сих пор существуют, а их формат не изменился после V7 Unix. Однако, они больше не определяют данные полностью. Большие установленные системы с множеством сетевых хостов хранят сведения в сетевых базах данных, которые представляют собой способ хранения информации на небольшом числе серверов, доступ к которым осуществляется через сеть[69]. Однако, такое использование прозрачно для большинства приложений, поскольку доступ к информации осуществляется через тот самый API, который использовался для получения сведений из текстовых файлов. Именно по этой причине POSIX стандартизует лишь API; в совместимой с POSIX системе файлы и не обязательно должны существовать.

API для этих двух баз данных похожи; большая часть обсуждения фокусируется на базе данных пользователей.

 

База данных пользователей

 

Традиционный формат /etc/passwd поддерживает по одной строке на пользователя. В каждой строке есть несколько полей, каждое из которых отделено от следующего символом двоеточия:

Grep arnold /etc/passwd

 

По порядку эти поля следующие:

Имя пользователя

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

Поле пароля

На старых системах здесь хранился зашифрованный пароль пользователя. На новых системах в этом поле скорее всего стоит x (как в данном случае), это означает, что сведения о пароле находятся в другом файле. Это разделение является средством обеспечения безопасности; если непривилегированному пользователю недоступен зашифрованный пароль, его значительно сложнее «взломать».

ID пользователя

Должен быть уникальным; один номер на пользователя.

ID группы

Это номер ID начальной группы пользователя. Как обсуждается далее, на современных системах с процессами связаны несколько групп.

Настоящее имя пользователя

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

Входной каталог

Этот каталог становится домашним каталогом для пользователей, когда они зарегистрируются в системе (– по умолчанию для команды).

Входная программа

Программа, которая запускается при регистрации пользователя. Обычно это оболочка, но не обязательно. Если это поле оставлено пустым, по умолчанию используется.

Доступ к базе данных пользователей осуществляется через процедуры, объявленные в:

 

Поля в, использующиеся различными процедурами API, напрямую соответствуют полям файла паролей.

 

(Имя историческое; когда разрабатывались ранние системы Unix, это поле содержало соответствующие сведения для учетной записи пользователя на системах Bell Labs Honeywell с операционной системой GECOS.)

Назначение каждой процедуры описано в следующем списке.

 

Возвращает указатель на внутреннюю структуру, содержащую сведения о «текущем» пользователе. Эта процедура читает всю базу данных паролей, по одной записи за раз, возвращая указатель на структуру для каждого пользователя. Каждый раз возвращается тот же самый указатель; т.е. для каждой записи пользователя внутренняя переписывается заново. Когда достигает конца базы данных паролей, она возвращает. Таким образом, она позволяет пройти через всю базу данных по одному пользователю за раз. Порядок, в котором возвращаются записи, не определен.

 

Сбрасывает внутреннее состояние, так что следующий вызов возвращает первую запись в базе данных паролей.

 

«Закрывает базу данных», так сказать, будь то простой файл, сетевое соединение или что‑нибудь еще.

 

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

 

Сходным образом ищет пользователя с номером ID, приведенным в, возвращая указатель на, описывающий пользователя, или, если пользователь не найден.

 – вот что нужно, когда есть номер ID пользователя (такой, как в) и вам нужно вывести имя соответствующего пользователя. преобразует имя в номер ID пользователя, например, если вы хотите использовать с файлом или. Теоретически обе эти процедуры осуществляют линейный поиск по базе данных паролей для обнаружения нужных сведений. На практике это верно, когда используется файл паролей, однако, кулуарные базы данных (сетевые или другие, как на системах BSD) склоняются к использованию более эффективных методов хранения, так что эти вызовы, возможно, в таком случае не такие дорогие[70].

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

 

ЗАМЕЧАНИЕ. Указатели, возвращаемые, и, все указывают на внутренние данные. Поэтому следует сделать копию их содержимого, если нужно сохранить сведения.

Хорошенько рассмотрите определение. Члены, представляющие символьные строки, являются указателями, они также указывают на внутренние данные, и если вы собираетесь скопировать структуру, не забудьте также скопировать и данные, на которые указывает каждый член структуры.

 

 

База данных групп

 

Формат базы данных групп подобен формату, но с меньшим числом полей.

Grep arnold /etc/group

 

Опять‑таки на одну группу отводится одна строка, с полями, разделенными двоеточием. Поля следующие.

Имя группы

Это имя группы, как оно отображается в '' или в любом другом контексте, когда требуется имя группы.

Пароль группы

Историческое поле. Оно больше не используется.

ID группы

Как и для ID пользователя, должен быть уникальным для каждой группы.

Список пользователей

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

В предыдущем примере мы видели, что пользователь является членом нескольких групп. Это членство на практике отражается в том, что называют набором групп (group set). Помимо главных номеров ID пользователя и ID группы, которые есть у процессов, набор групп является набором номеров ID дополнительных групп, который имеет при себе каждый процесс. Система проверяет на соответствие с этими ID групп, ID группы файла при осуществлении проверки прав доступа. Эта тема более подробно обсуждается в разделе 11 «Разрешения и ID пользователя и группы».

API базы данных групп сходна с API для базы данных пользователей. Следующие функции определены в:

 

struct group соответствует записям в /etc/group:

 

 

Поле требует некоторого объяснения. Хотя оно объявлено в виде указателя на указатель (), лучше представить его как массив строк (наподобие). Последний элемент в массиве устанавливается в. Когда в списке нет членов, первый элемент массива равен.

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

 

 

Функция сначала проверяет ошибки (строки 17–20). Основным компонентом программы является вложенный цикл. Внешний цикл (строка 22) перечисляет все записи базы данных группы. Внутренний цикл (строка 23) перечисляет всех членов массива. Если один из членов соответствует имени из командной строки (строка 24), для печати записи вызывается (строка 25):

 

Функция (строки 34–48) проста, ее логика подобна логике для печати списка членов. Члены списка группы разделены запятыми; поэтому тело цикла до вывода запятой должно проверить, что следующий элемент в массиве не является. Этот код работает правильно, даже если в группе нет членов. Однако мы знаем, что для этой программы есть члены, иначе не была бы вызвана! Вот что происходит при запуске программы:

ch06‑groupinfo arnold

 

Терминалы:

 

Модель стандартного ввода, стандартного вывода и стандартной ошибки Linux/Unix препятствует специальной трактовке устройств ввода и вывода. Программам обычно не нужно знать или беспокоиться о том, направляется ли их вывод на терминал, в файл, канал, физическое устройство или что‑то еще.

Однако иногда бывают моменты, когда программе действительно нужно знать, с какого рода файлом связан файловый дескриптор. Семейство вызовов часто предоставляет достаточно сведений обычный файл, каталог, устройство и т.д. Хотя иногда даже этого недостаточно, и для интерактивных программ, в частности, вам может потребоваться знать, не представляет ли дескриптор файла.

tty (сокращение для Teletype, одного из ранних производителей компьютерных терминалов) является любым устройством, представляющим терминал, т.е. нечто, что человек мог бы использовать для взаимодействия с компьютером. Это может быть либо аппаратное устройство, такое, как клавиатура и монитор персонального компьютера, или старинный терминал видеодисплея, соединенный с компьютером через последовательный порт или модем, или программный псевдотерминал, такой, который используется в оконных системах и при сетевых регистрациях.

Различить можно с помощью.

 

Эта функция возвращает 1, если дескриптор файла представляет терминал, в противном случае 0. В соответствии с POSIX может установить для указания ошибки; поэтому до вызова следует установить errno в 0, а затем проверить ее значение, если был возвращен 0. (Справочная страница GNU/Linux isatty (3) не упоминает об использовании.) Стандарт POSIX также указывает, что просто возврат 1 не означает, что на другом конце дескриптора файла находится человек!

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

 

6.5. Рекомендуемая литература

 

1. Mastering Algorithms With C by Kyle Loudon. O'Reilly & Associates, Sebastopol, California, USA, 1999. ISBN: 1‑56592‑453‑3.

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

2. The Art of Computer Programming Volume 3. Sorting and Searching, 2nd edition, by Donald E. Knuth Addison‑Wesley, Reading Massachusetts, USA, 1998. ISBN: 0‑201‑89685‑0.[71]

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

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

 

Резюме

 

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

• Структура представляет «разложенное время», которое является значительно более удобным представлением даты и времени. и преобразуют значения в значения, a действует в обратном направлении.

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

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

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

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

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

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

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

 

Упражнения

 

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

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

 

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

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

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

5. Добавьте к своей версии еще одну опцию, которая принимает имя файла и использует время модификации данного файла как новое время модификации файла, указанного в командной строке.

6. Усовершенствуйте так, чтобы она сортировала отдельный массив указателей, указывающих на массив сотрудников.

7. Добавьте к опции для сортировки по номеру индекса, времени модификации, времени доступа и размеру. Добавьте «обратную опцию», так, чтобы основанная на времени сортировка первым помещала самый недавний файл, а по другим критериям (размеру, индексу) помещала вначале наибольшее значение.

8. Напишите простую версию команды. Она должна использоваться так:

 

Здесь пользователь и группа являются именами пользователя и группы, представляющими новых пользователя и группу для указанных файлов. Группа необязательна; если она присутствует, она отделяется от пользователя двоеточием. Чтобы протестировать свою версию на системе GNU/Linux, вы должны зарегистрироваться в качестве. Делайте это осторожно!

9. Усовершенствуйте свою, чтобы допустить использование числовых значений пользователя или группы наряду с их именами.

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

11. Напишите специализированную библиотеку поиска пользователей, которая считывает в динамически выделяемый массив всю базу данных пользователей. Предусмотрите быстрый поиск пользователей как по ID, так и по именам. Гарантируйте обработку случая, при котором запрошенный пользователь не найден.

12. Сделайте то же самое для базы данных групп.

13. Напишите программу, которая печатает содержимое для каждого файла, указанного в командной строке. Она должна выводить все значения в формате, <


Поделиться с друзьями:

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.241 с.