ioctl
tende a andar de mãos dadas com uma entrada /dev
; seu código típico faria
fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);
Este é um comportamento Unix perfeitamente padrão. Dentro do driver do kernel você pode colocar controles de acesso (por exemplo, apenas root
pode fazer algumas coisas, ou requer uma capacidade específica para acesso mais refinado) o que o torna bastante flexível e poderoso.
É claro que isso significa que os dispositivos podem expor muito mais do que usar a atividade de leitura / gravação de bloco / caractere; muitas coisas podem ser feitas via ioctl
calls. Não é tão fácil de usar a partir de scripts de shell, mas é muito fácil de C
ou perl
ou python
ou similar.
sysfs
entradas são outra maneira de interagir com os drivers. Normalmente, cada tipo de comando teria uma entrada diferente, portanto, pode ser complicado escrever o driver, mas isso facilita o acesso via userspace; scripts de shell simples podem manipular muitas coisas, mas podem não ser muito eficientes
netlink
é principalmente focado (eu acho!) em transferências de dados de rede, mas poderia ser usado para outras coisas. É muito bom para grandes volumes de transferência de dados e é supostamente um sucessor de ioctl
em alguns casos.
Todas as opções são boas; seu caso de uso pode determinar melhor qual tipo de interface expor do seu driver.