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

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

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


person makes    schedule 03.09.2011    source источник


Ответы (1)


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

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

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

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

person Jonathan Leffler    schedule 03.09.2011
comment
Чтобы расширить это, поэтапный отказ POSIX от ioctl не означает, что ioctl не следует использовать, а скорее POSIX не заинтересован в указании того, как должны работать аппаратные устройства. Поскольку ioctl также использовался с STREAMS, POSIX ранее определял только этот аспект ioctl (не любое другое использование с устройствами), но теперь, когда STREAMS устарели, нечего указывать. - person R.. GitHub STOP HELPING ICE; 03.09.2011
comment
Спасибо - да, именно это я и имел в виду. - person Jonathan Leffler; 03.09.2011
comment
ioctl() восходит к прошлому... лично я использовал его в 1980-х. Хотя в руководствах System V 1983 года я до сих пор описываю ioctl(), фактическая грязь о том, как ее использовать, была найдена в файлах .h и технических руководствах. Я призываю вас поместить все детали ВАШИХ ioctl в файл .h для устройства, чтобы быть уверенным, что они всегда доступны для разработчиков. - person Gilbert; 03.09.2011