ioctl
стремится идти рука об руку со /dev
входом; ваш типичный код будет делать
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
Это совершенно стандартное поведение Unix. Внутри драйвера ядра вы можете поместить элементы управления доступом (например, root
можете делать только некоторые вещи или требовать особой возможности для более детального доступа), что делает его довольно гибким и мощным.
Конечно, это означает, что устройства могут предоставлять гораздо больше, чем просто использовать чтение / запись блоков / символов; многие вещи можно сделать с помощью ioctl
звонков. Не так просто использовать из сценариев оболочки, но довольно легко из C
или perl
или python
или аналогичным.
sysfs
записи являются еще одним способом взаимодействия с драйверами. Как правило, каждый тип команды будет иметь различную запись, поэтому написать драйвер может быть сложно, но это очень облегчает доступ через пользовательское пространство; простые сценарии оболочки могут манипулировать многими вещами, но могут быть не очень эффективными
netlink
в первую очередь ориентирован (я думаю!) на передачу данных по сети, но его можно использовать для других целей. Это действительно хорошо для больших объемов передачи данных и ioctl
в некоторых случаях должно быть преемником .
Все варианты хороши; ваш вариант использования может лучше определить, какой тип интерфейса следует использовать в вашем драйвере.