Введение в модель ввода/вывода Linux/Unix — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

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

Введение в модель ввода/вывода Linux/Unix

2021-01-29 99
Введение в модель ввода/вывода Linux/Unix 0.00 из 5.00 0 оценок
Заказать работу

 

Модель API Linux/Unix для ввода/вывода проста. Ее можно суммировать четырьмя словами. открыть, прочитать, записать, закрыть. Фактически, это имена системных вызовов:,,,. Вот их объявления:

 

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

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

 

Представление базовой структуры программы

 

Наша версия cat следует структуре, которая обычно является полезной. Первая часть начинается с комментариев, заголовочных файлов, объявлений и функции main():

 

 

…продолжение далее в главе.

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

Когда в качестве имени файла дано (простая черточка, или знак минус), Unix вместо попытки открыть файл с именем читает стандартный ввод. Вдобавок, читает стандартный ввод, когда нет аргументов. реализует оба этих поведения. Условие '' (строка 27) истинно, когда нет аргументов имени файла; в этом случае передает «» функции. В противном случае, перечисляет аргументы, рассматривая их как файлы, которые необходимо обработать. Если один из них окажется «», программа обрабатывает стандартный ввод.

Если возвращает ненулевое значение, это означает, что случилась какая‑ то ошибка. Ошибки подсчитываются в переменной (строки 28 и 31). Когда завершается, она возвращает 0, если не было ошибок, и 1, если были (строка 33). Это довольно стандартное соглашение, значение которого более подробно обсуждается в разделе 9.1.5.1 «Определение статуса завершения процесса».

Структура, представленная в, довольно общая: может делать с файлом все, что мы захотим. Например (игнорируя особый случай «»), process() также легко могла бы удалять файлы вместо их объединения!

Прежде чем рассмотреть функцию, нам нужно описать, как представлены ошибки системных вызовов и как осуществляется ввод/вывод. Сама функция представлена в разделе 4.4.3 «Чтение и запись».

 

Определение ошибок

 

«Если неприятность может произойти, она случается»

‑ Закон Мерфи ‑

 

«Будь готов»

‑ Бойскауты ‑

 

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

Основные системные вызовы Linux почти всегда возвращают при ошибке ‑1 и 0 или положительное значение при успехе. Это дает возможность узнать, была операция успешной или нет:

 

 

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

 

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

 

Значения

 

Стандарт POSIX 2001 определяет большое число возможных значений для errno. Многие из них относятся к сетям, IPC или другим специальным задачам. Справочная страница для каждого системного вызова описывает возможные значения, которые могут иметь место; поэтому вы можете написать код для проверки отдельных ошибок и соответствующим образом обработать их, если это нужно. Возможные значения определены через символические имена. Предусмотренные GLIBC значения перечислены в табл. 4.1.

 

Таблица 4.1. Значения GLIBC для

 

 Имя Значение
  Слишком длинный список аргументов
  Доступ запрещен
  Адрес используется
  Адрес недоступен
  Семейство адресов не поддерживается
  Ресурс недоступен, попытайтесь снова (может быть то же самое значение, что).
  Соединение уже устанавливается
  Ошибочный дескриптор файла.
  Ошибочное сообщение.
  Устройство или ресурс заняты
  Отмена операции.
  Нет порожденного процесса.
  Соединение прервано
  Соединение отклонено
  Восстановлено исходное состояние соединения.
  Возможен тупик (deadlock) в запросе ресурса.
  Требуется адрес назначения
  Математический аргумент выходит за область определения функции
  Зарезервировано.
  Файл существует.
  Ошибочный адрес.
  Файл слишком большой.
  Хост недоступен.
  Идентификатор удален
  Ошибочная последовательность байтов.
  Операция исполняется.
  Прерванная функция.
  Недействительный аргумент.
  Ошибка ввода/вывода.
  Сокет (уже) соединен.
  Это каталог.
  Слишком много уровней символических ссылок.
  Слишком много открытых файлов.
  Слишком много ссылок.
  Сообщение слишком длинное.
  Зарезервировано.
  Имя файла слишком длинное
  Сеть не работает
  Соединение прервано сетью
  Сеть недоступна.
  В системе открыто слишком много файлов.
  Буферное пространство недоступно.
  Устройство отсутствует
  Файл или каталог отсутствуют
  Ошибочный формат исполняемого файла.
  Блокировка недоступна.
  Зарезервировано.
  Недостаточно памяти.
  Сообщение нужного типа отсутствует
  Протокол недоступен.
  Недостаточно памяти в устройстве.
  Функция не поддерживается.
  Сокет не соединен.
  Это не каталог
  Каталог не пустой.
  Это не сокет
  Не поддерживается
  Неподходящая операция управления вводом/выводом
  Нет такого устройства или адреса.
  Операция сокета не поддерживается
  Слишком большое значение для типа данных
  Операция не разрешена
  Канал (pipe) разрушен
  Ошибка протокола.
  Протокол не поддерживается
  Ошибочный тип протокола для сокета
  Результат слишком большой
  Файловая система только для чтения
  Недействительный поиск
  Нет такого процесса
  Зарезервировано
  Тайм‑аут соединения истек
  Текстовый файл занят
  Блокирующая операция (может быть то же значение, что и для)
  Ссылка через устройство (cross‑device link)

Многие системы предоставляют также другие значения ошибок, а в более старых системах может не быть всех перечисленных значений ошибок. Полный список следует проверить с помощью справочных страниц intro (2) и errno (2) для локальной системы.

 

ЗАМЕЧАНИЕ. следует проверять лишь после того, как возникла ошибка и до того, как сделаны дальнейшие системные вызовы. Начальное значение той переменной 0. Однако, в промежутках между ошибками ничто не изменяет ее значения, это означает, что успешный системный вызов не восстанавливает значение 0. Конечно, вы можете вручную установить ее в 0 в самом начале или когда захотите, однако это делается редко.

 

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

 

Функция выводит предоставленную программой строку, за которой следует двоеточие, а затем строка, описывающая значение:

 

 

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

 

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

 

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

 

Стиль сообщения об ошибках

 

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

 

 

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

 

Таблица 4.2. Диагностические идентификаторы C99

 

 Идентификатор Версия С Значение
  C89 Дата компиляции в виде «»
  Оригинальная Имя исходного файла в виде «»
  Оригинальная Номер строки исходного файла в виде 42
  C89 Время компиляции в виде «»
  C99 Имя текущей функции, как если бы было объявлено

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

Сегодня, хотя системы GNU/Linux поставляются с исходными кодами, указанный исходный код часто не устанавливается по умолчанию. Поэтому использование этих идентификаторов для сообщений об ошибках не представляет дополнительной ценности. GNU Coding Standard s даже не упоминает их.

 

 

Ввод и вывод

 

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

 


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

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

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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...



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

0.02 с.