Использует ли программист файлы устройств в качестве интерфейса с драйверами устройств в своих программах?

В оболочке Linux пользователь может получить доступ к драйверу устройства через свой файл устройства в качестве интерфейса.

Когда программист Linux C хочет получить доступ к драйверу в своей программе на C, он также получает доступ к драйверу через свой файл устройства в качестве интерфейса?

Другими словами, является ли файл устройства интерфейсом для драйвера устройства только в оболочке, но не в программе на C или в обоих?

Файлы устройств AFAIK являются единственной опцией для процессов пользовательского доступа для доступа к устройствам. Ядру все равно, является ли этот процесс оболочкой.

Программы C имеют возможность тонкой настройки доступа к устройству: вызов ioctl :

man 2 ioctl :

 int ioctl(int d, unsigned long request, ...); 

Возможно, для этого есть оболочка оболочки, но я ничего не знаю.

 > strace fdisk -l /dev/sda [...] open("/dev/sda", O_RDONLY|O_CLOEXEC) = 3 [...] ioctl(3, BLKGETSIZE64, 500107862016) = 0 [...] ioctl(3, CDROM_GET_CAPABILITY or SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT, 0) = -1 ENOTTY (Inappropriate ioctl for device) ioctl(3, BLKALIGNOFF, 0) = 0 ioctl(3, BLKIOMIN, 4096) = 0 ioctl(3, BLKIOOPT, 0) = 0 ioctl(3, BLKPBSZGET, 4096) = 0 ioctl(3, BLKSSZGET, 512) = 0 ioctl(3, BLKSSZGET, 512) = 0 uname({sys="Linux", node="inno", ...}) = 0 ioctl(3, BLKGETSIZE64, 500107862016) = 0 ioctl(3, HDIO_GETGEO, {heads=255, sectors=63, cylinders=60801, start=0}) = 0