Ядро ОС Linux

Функция ioctl().


Функция ioctl() осуществляет функцию передачи контроля ввода/вывода. Структура вашей функции должна быть следующей: первичная проверка ошибок, затем переключение, дающее вам право контролировать все ioctl. Номер ioctl находится в аргументе cmd, аргумент контролируемой команды находится в arg. Для работы с ioctl() вы должны иметь подробное представление о контроле над вводом/выводом. Если вы сомневаетесь в правильности использования ioctl(), спросите кого-нибудь, так как эта функция в текущий момент может оказаться ненужной. Так как ioctl() является частью интерфейса драйверов, вам придется уделить ей внимание.

  • struct inode * inode
    - Указатель на inode структуру данного устройства;
  • struct file * file
    - Указатель на файловую структуру устройства;
  • unsigned int cmd
    - Команда, над которой осуществляется контроль;
  • unsigned int arg
    - Это аргумент для команды, определяется пользователем. В случае, если он вида (void *), он может быть использован как указатель на область пользователя, обычно находящуюся в регистре fs.
  • Возвращаемое значение :
    -errno в случае ошибки, все другие значения определяются пользователем.

Если слот ioctl() в file_operations не заполнен, VFS возвращает значение -EINVAL, однако в любом другом случае, кесли cmd принимант одно из значений - FIOCLEX, FIONCLEX,FIONBIO, FIOASYNC, будет происходить следующее:

  • FIOCLEX 0x5451
    Устанавливает бит "закрытие для запуска"
  • FIONCLEX 0x5450
    Очищает бит "закрытие для запуска"
  • FIONBIO 0x5421
    Если аргумент не равен 0, устанавливает O_NONBLOCK, иначе очищает O_NONBLOCK.
  • FIOASYNC 0x5421
    Если аргумент не равен 0, устанавливает O_SYNC, иначе очищает O_SYNC. Пока еще не описано, но для полноты вставлено в ядро.

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



Содержание раздела