Читаем Linux API. Исчерпывающее руководство полностью

4.8. Операции, не вписывающиеся в модель универсального ввода-вывода: ioctl()

Системный вызов ioctl() — механизм общего назначения для выполнения операций в отношении файлов и устройств, выходящих за пределы универсальной модели ввода-вывода, рассмотренной ранее в данной главе.

#include

int ioctl(int fd, int request… /* argp */);

Возвращаемое при успешном завершении значение зависит от request или при ошибке равно –1

Аргумент fd содержит дескриптор открываемого файла, представленного устройством или файлом, в отношении которого выполняется управляющая операция (указана в аргументе request). Как показывает стандартная для языка C запись в виде многоточия (…), третий аргумент для ioctl(), обозначенный как argp, может быть любого типа. Аргумент request позволяет ioctl() определить, какого типа значение следует ожидать в argp. Обычно argp представляет собой указатель либо на целое число, либо на структуру. В некоторых случаях этот аргумент не применяется.

Использование ioctl() будет показано в следующих главах (к примеру, в разделе 15.5).

Единственная спецификация, имеющаяся в SUSv3 для ioctl(), регламентирует операции по управлению STREAMS-устройствами. (Среда STREAMS относится к особенностям System V, не поддерживаемым основной ветвью ядра Linux, хотя было разработано несколько реализаций в виде дополнений.) Ни одна из других рассматриваемых в книге операций ioctl() в SUSv3 не регламентирована. Но вызов ioctl() был частью системы UNIX с самых ранних версий, вследствие чего несколько операций ioctl() предоставляются во многих других реализациях UNIX. По мере рассмотрения каждой операции ioctl() будут обсуждаться и вопросы портируемости.

4.9. Резюме

Чтобы выполнить ввод/вывод в отношении обычного файла, сначала нужно получить его дескриптор, воспользовавшись системным вызовом open(). Затем ввод/вывод выполняется с помощью системных вызовов read() и write(). После завершения всех операций ввода-вывода следует высвободить дескриптор файла и связанные с ним ресурсы, воспользовавшись системным вызовом close(). Эти системные вызовы могут применяться для выполнения ввода-вывода в отношении всех типов файлов.

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

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

Системный вызов ioctl() предлагает для устройства и файла разнообразные операции, которые не вписываются в стандартную модель файлового ввода-вывода.

4.10. Упражнения

4.1. Команда tee считывает свой стандартный ввод, пока ей не встретится символ конца файла, записывает копию своего ввода на стандартное устройство вывода и в файл, указанный в аргументе ее командной строки. (Пример использования этой команды будет показан при рассмотрении FIFO-устройств в разделе 44.7.) Реализуйте tee, используя системные вызовы ввода-вывода. По умолчанию tee перезаписывает любой существующий файл с заданным именем. Укажите ключ командной строки — a (tee — a file), который заставит tee добавлять текст к концу уже существующего файла.

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

5 Только если файла с таким именем еще не было в текущем каталоге. Иначе эта команда лишь обновит время последнего обращения к файлу. — Примеч. пер.

<p>5. Файловый ввод-вывод: дополнительные сведения</p>

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

Будет представлен еще один многоцелевой системный вызов, имеющий отношение к файлам, — fcntl(). Мы рассмотрим один из примеров его использования: извлечение и установку флагов состояния открытого файла.

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных