Замена для функции ioctl () - PullRequest
       56

Замена для функции ioctl ()

6 голосов
/ 03 сентября 2011

Я разрабатываю модель ввода-вывода драйвера устройства для небольших приложений микроконтроллера, используя POSIX в качестве руководства для проектирования интерфейса. Я реализовал ioctl() в качестве средства управления параметрами драйвера / оборудования - например, скорость передачи UART, адрес подчиненного устройства I2C и т. Д.

Я заметил, что POSIX: 2008 перечисляет ioctl() и <stropts.h> как устаревший . Каков рекомендуемый альтернативный механизм для связи с драйвером устройства?

1 Ответ

8 голосов
/ 03 сентября 2011

POSIX определяет только очень ограниченное подмножество функциональных возможностей ioctl() - связанных с STREAMS. Поскольку средство STREAMS устарело, интерфейс к нему также устарел в POSIX.

Однако ioctl() является частью Unix с момента «навсегда» (это было, безусловно, в 7-м издании UNIX, и я вполне уверен, что он не был новым даже тогда). Это «способ» управления драйверами устройств после их открытия. Единственная проблема заключается в том, что такие интерфейсы и элементы управления не стандартизированы.

Вы можете взглянуть на файлы <termios.h> для набора функций, записанных для управляющих терминалов. Я ожидаю, что типичная реализация использует ioctl() или другие подобные специализированные механизмы, но интерфейс был сделан общим, когда он был стандартизирован (интерфейс <termios.h> не идентичен ни одному более раннему интерфейсу, ни 7-й редакции, ни System III, ни любому другому. другой интерфейс). Если вы хотите, вы можете написать стандартные функции поверх интерфейса ioctl(), которые будут использовать ваши пользователи; Вы бы реализовали эти функции для вызова на свой ioctl() интерфейс.

Итак, ioctl() не уходит; это правильный способ управления драйверами устройств. У POSIX немного другая программа, вот и все.

...