IOCTL(2)

ИМЯ
ioctl - управляет устройством

ОБЗОР
#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.

СМОТРИТЕ ТАКЖЕ
execve(2), fcntl(2), ioctl_console(2), ioctl_fat(2), ioctl_ficlonerange(2), ioctl_fideduperange(2), ioctl_getfsmap(2), ioctl_iflags(2), ioctl_list(2), ioctl_ns(2), ioctl_tty(2), ioctl_userfaultfd(2), open(2), sd(4), tty(4)