20.3.7. Вызовы ioctl(2) и fcntl(2) являются препятствиями
20.3.7. Вызовы ioctl(2) и fcntl(2) являются препятствиями
Механизмы ioctl(2) и fcntl(2) обеспечивают способ написания перехватчиков (hooks) в драйверах устройств. Первоначальным историческим использованием ioctl(2) была установка параметров, таких как скорость передачи и количество фреймирующих битов в драйверах последовательных линий, отсюда и название ("I/O control"). Позднее вызовы ioctl были добавлены для других драйверов, a fcntl(2) был добавлен как перехватчик в файловую систему.
С годами вызовы ioctl и f cntl распространились. Они часто слабо документированы, а также нередко являются источником проблем переносимости. Каждому из них сопутствует неаккуратное нагромождение макроопределений, описывающих типы операций и специальные значения аргументов.
Основная проблема в данном случае та же, что и "большой блок байтов"; объектная модель Unix слабая и не оставляет естественного пространства для размещения многих вспомогательных операций. Разработчики получают сложный выбор из неудовлетворительных альтернатив. Вызовы f cntl/ioctl проходят через устройства в /dev, новые специализированные системные вызовы или методы через специализированные виртуальные файловые системы, которые привязаны к ядру (например, /ргос Linux и др.).
Пока не ясно, улучшится ли в будущем объектная модель Unix, а если улучшится, то каким образом. Если MacOS-подобные атрибуты файлов станут обычной функцией Unix, подстройка "магических" именованных атрибутов на драйверах устройств может взять на себя роль, которую в настоящее время играют вызовы ioctl/fcntl (это, по крайней мере, исключило бы необходимость в применении макроопределений перед использованием интерфейса). Выше уже отмечалось, что операционная система Plan 9, в которой вместо модели файл/поток байтов используется именованный файловый сервер или файловая система как базовый объект, представляет другой возможный путь.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
9.4.3. Управление атрибутами файла: fcntl()
9.4.3. Управление атрибутами файла: fcntl() Системный вызов fcntl() («управление файлом») предоставляет контроль над различными атрибутами либо самого дескриптора файла, либо лежащего в его основе открытого файла. Справочная страница GNU/Linux fcntl(2) описывает это таким способом:#include
9.4.3.5. Сводка fcntl()
9.4.3.5. Сводка fcntl() Сводка для системного вызова fcntl() приведена в табл. 9.5.Таблица 9.5. Сводка fcntl() Значение cmd Значение arg Возвращает F_DUPFD Наименьший новый дескриптор Дублирует аргумент fd F_GETFD Получает флаги дескриптора файла (close-on-exec) F_SETFD Новое значение
14.2.2. Блокировка POSIX: fcntl() и lockf()
14.2.2. Блокировка POSIX: fcntl() и lockf() Системный вызов fcntl() (file control — управление файлом) используется для блокировки файла. (Другое использование fcntl() было описано в разделе 9.4.3 «Управление атрибутами файла: fcntl()».) Он объявлен следующим образом:#include <unistd.h> /* POSIX */#include <fcntl.h>int
Функция fcntl(2)
Функция fcntl(2) После открытия файла и получения ссылки на него в виде файлового дескриптора процесс может производить различные файловые операции. Функция fcntl(2) позволяет процессу выполнить ряд действий с файлом, используя его дескриптор, передаваемый в качестве первого
7.11. Функция fcntl
7.11. Функция fcntl Сокращение fcntl означает «управление файлами» (file control). Эта функция выполняет различные операции управления дескрипторами. Перед описанием этой функции и ее влияния на сокет нам нужно составить некоторое более общее представление о ее возможностях. В табл.
Глава 17 Операции функции ioctl
Глава 17 Операции функции ioctl 17.1. Введение Функция ioctl традиционно являлась системным интерфейсом, используемым для всего, что не входило в какую-либо другую четко определенную категорию. POSIX постепенно избавляется от функции ioctl, создавая заменяющие ее функции-обертки и
17.2. Функция ioctl
17.2. Функция ioctl Эта функция работает с открытым файлом, дескриптор которого передается через аргумент fd.#include <unistd.h>int ioctl(int fd, int request, ... /* void *arg */ );Возвращает: 0 в случае успешного выполнения, -1 в случае ошибкиТретий аргумент всегда является указателем, но тип указателя
31.5. Функция ioctl
31.5. Функция ioctl Говоря о потоках, мы снова возвращаемся к функции ioctl, которая уже была описана в главе 17.#include <stropts.h>int ioctl(int fd, int request, ... /* void *arg */ );Возвращает: 0 в случае успешного выполнения, -1 в случае ошибкиЕдинственным изменением относительно прототипа функции,
10.1.2.5 Ioctl
10.1.2.5 Ioctl Системная функция ioctl является обобщением специфичных для терминала функций stty (задать установки терминала) и gtty (получить установки терминала), имевшихся в ранних версиях системы UNIX. Она выступает в качестве общей точки входа для всех связанных с типом
9.3. Блокирование записей с помощью fcntl по стандарту Posix
9.3. Блокирование записей с помощью fcntl по стандарту Posix Согласно стандарту Posix, интерфейсом для блокировки записей является функция fcntl:#include <fcntl.h>int fcntl(int fd, int cmd,… /* struct flock *arg */);/* Возвращает –1 в случае ошибки: результат, возвращаемый в случае успешного завершения,
Блокировка записей fcntl
Блокировка записей fcntl Последняя пpoгрaммa использует fcntl для синхронизации. Функция main приведена в листинге А.30. Эта программа будет выполняться успешно только в том случае, если количество потоков равно 1, поскольку блокировка fcntl предназначена для использования между
44. Предпочитайте функции, которые не являются ни членами, ни друзьями
44. Предпочитайте функции, которые не являются ни членами, ни друзьями РезюмеТам, где это возможно, предпочтительно делать функции не членами и не друзьями классов.ОбсуждениеФункции, не являющиеся членами или друзьями классов, повышают степень инкапсуляции путем
20.3.7. Вызовы ioctl(2) и fcntl(2) являются препятствиями
20.3.7. Вызовы ioctl(2) и fcntl(2) являются препятствиями Механизмы ioctl(2) и fcntl(2) обеспечивают способ написания перехватчиков (hooks) в драйверах устройств. Первоначальным историческим использованием ioctl(2) была установка параметров, таких как скорость передачи и количество
6.7. Функция ioctl()
6.7. Функция ioctl() Системный вызов ioctl() — это универсальное средство управления аппаратными устройствами. Первым аргументом функции является дескриптор файла того устройства, которым требуется управлять. Второй аргумент — это код запроса, обозначающего выполняемую
Утверждения не являются механизмом проверки вводимых данных
Утверждения не являются механизмом проверки вводимых данных Полезно сосредоточиться на некоторых неявно обсуждавшихся свойствах контрактов. Заметьте, контракты описывают только взаимодействие двух программ (программа - программа). Контракты не задают другие виды