ioctl(2) управляет устройством

ОБЗОР

#include <sys/ioctl.h>

int ioctl(int fd, unsigned long request, ...);

ОПИСАНИЕ

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

Второй аргумент является кодом запроса, значение которого зависит от устройства. Третий аргумент является нетипизированным указателем на память. Обычно, это char *argp (было до тех пор, пока в C не появился vvoid *) и далее он будет называться именно так.

В значении request функции ioctl() кодируется информация является ли параметр входным или выходным и размер аргумента argp в байтах. Макросы и определения, используемые при указании в ioctl() запросах request, определены в файле <sys/ioctl.h>.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Обычно, при успешном завершении возвращается ноль. В некоторых ioctl() запросах возвращаемое значение считается выходным параметром и при успешном завершении возвращается неотрицательное значение. В случае ошибки возвращается -1 и значение errno устанавливается соответствующим образом.

ОШИБКИ

EBADF
Значение fd не является правильным файловым дескриптором.
EFAULT
argp ссылается на недоступную область памяти.
EINVAL
Неправильное значение request или argp.
ENOTTY
Значение fd не связано со специальным символьным устройством.
ENOTTY
Указанный запрос не применяется к типу объекта, на который ссылается файловый дескриптор fd.

СООТВЕТСТВИЕ СТАНДАРТАМ

Нет единого стандарта. Аргументы, возвращаемые значения и семантика ioctl() варьируются в соответствии с драйвером устройства (вызов, используемый как всеохватывающий, не полностью соответствует потоковой модели ввода/вывода в UNIX). В ioctl_list(2) можно найти список многих известных вызовов ioctl(). Функция ioctl() появилась в AT&T UNIX версии 7.

ЗАМЕЧАНИЯ

Чтобы использовать этот вызов требуется открытый файловый дескриптор. Часто вызов open(2) приводит к нежелательным эффектам, которых в Linux можно избежать указав флаг O_NONBLOCK.