У Unix-подібних операційних системах файл пристрою, вузол пристрою або спеціальний файл — це інтерфейс до драйвера пристрою, який відображається у файловій системі так, ніби це звичайний .

Також є спеціальні файли в DOS, OS/2 та Windows. Вони дозволяють прикладній програмі взаємодіяти з пристроєм через його драйвер, використовуючи стандартні системні виклики введення/виведення.

Застосування стандартних системних викликів спрощує багато задач програмування та забезпечує узгоджений механізм введення/виведення в просторі користувача незалежно від особливостей і функцій конкретного пристрою.

Огляд Файли пристроїв зазвичай надають прості інтерфейси до стандартних пристроїв (таких як принтери та послідовні порти), але також можуть використовуватися для доступу до окремих унікальних ресурсів цих пристроїв, наприклад до . Крім того, файли пристроїв корисні для доступу до системних ресурсів, які не пов’язані з жодним реальним пристроєм, таких як та генератори випадкових чисел.

В Unix-подібних операційних системах існує два основні типи файлів пристроїв: символьні та блокові спеціальні файли. Різниця між ними полягає в тому, який обсяг даних зчитується та записується операційною системою і апаратним забезпеченням.

Разом їх можна називати спеціальними файлами пристроїв, на відміну від іменованих каналів(named pipes), які не пов’язані з жодним пристроєм, але при цьому також не є звичайними файлами.

MS-DOS запозичила концепцію спеціальних файлів з Unix, але перейменувала їх на пристрої. Оскільки ранні версії MS-DOS не підтримували ієрархію каталогів, пристрої відрізнялися від звичайних файлів тим, що їхні імена були зарезервованими словами, які не можна було використовувати як імена файлів або папок; наприклад, слово CON є зарезервованим.

Ці імена було обрано з метою певної сумісності з CP/M і вони зберігаються в сучасних версіях Windows для зворотної сумісності. Імена не залежать від регістру, тому "con", "Con" і "CON" — усі є недопустимими назвами.

У Windows XP введення «Con» у команді Run (Виконати) призводить до появи повідомлення про помилку:

«This file does not have a program associated with it for performing this action. Create an association in the Folder Options control panel.»

Спроба перейменувати будь-який файл або папку, використовуючи зарезервоване ім’я, тихо повертає файлу чи папці попередню назву (або «New Folder», «New Text Document» тощо) без будь-якого повідомлення чи помилки. У Windows Vista та пізніших версіях спроба використати зарезервоване ім’я для файлу або папки викликає повідомлення про помилку:

«The specified device name is invalid.»

У деяких Unix-подібних системах більшість файлів пристроїв керуються як частина віртуальної файлової системи, яка традиційно монтується в /dev. Вона може бути пов’язана з керуючим демоном, що в режимі реального часу відстежує підключення та відключення апаратних пристроїв і відповідно вносить зміни до файлової системи пристроїв, якщо це не робиться автоматично ядром, а також може викликати скрипти в системному або користувацькому просторі для обробки спеціальних потреб пристроїв.

У FreeBSD, DragonFly BSD та Darwin використовується окрема файлова система devfs; вузли пристроїв автоматично керуються цією файловою системою в . Linux раніше мав подібну реалізацію devfs, але згодом від неї відмовилися, а починаючи з версії 2.6.17; її було повністю вилучено. Нині Linux переважно використовує реалізацію , відому як udev, хоча існує багато її варіантів.

В Unix-системах, які підтримують ізоляцію процесів за допомогою chroot (наприклад, ), ззазвичай кожне середовище chroot потребує власного каталогу /dev; ці точки монтування будуть видимі в хост-ОС у різних вузлах глобального дерева файлової системи.

Обмежуючи набір вузлів пристроїв, що заповнюють /dev усередині chroot-екземплярів, можна забезпечити апаратну ізоляцію цим середовищем (програма не може втручатися в апаратні ресурси, яких вона не бачить і не може назвати — це сильніша форма контролю доступу, ніж дозволи файлової системи Unix).

MS-DOS керувала конкуренцією за апаратні пристрої (див. програму «terminate-and-stay-resident» ), шляхом ексклюзивного відкриття кожного файлу пристрою. Прикладна програма, яка намагалася отримати доступ до пристрою, що вже використовується, виявляла, що не може відкрити відповідний вузол файлу пристрою.

У Unix та Linux реалізовано різноманітні семантики драйверів пристроїв щодо .

Unix та Unix-подібні системи

Вузли пристроїв відповідають ресурсам, які ядро операційної системи вже виділило. Unix ідентифікує ці ресурси за допомогою старшого (major) та молодшого (minor) номерів, кі зберігаються як частина структури вузла.

Призначення цих номерів відбувається по-різному в різнихопераційних системах та на різних комп'ютерних платформах. Зазвичай major-номер визначає драйвер пристрою, а minor-номер — конкретний пристрій (можливо, один із багатьох), яким керує цей драйвер; у такому разі система може передавати minor-номер драйверу. Проте за наявності динамічного виділення номерів це правило може не виконуватися (наприклад, у FreeBSD 5 і вище).

Як і інші типи спеціальних файлів, комп’ютерна система отримує доступ до вузлів пристроїв за допомогою стандартних системних викликів і обробляє їх так само, як звичайні файли.

Існує два стандартні типи файлів пристроїв; на жаль, з історичних причин їхні назви є доволі неінтуїтивними, через що пояснення відмінностей між цими двома типами часто подаються некоректно.

Пристрої для створення символів Символьні спеціальні файли або символьні пристрої надають небуферизований, прямий доступ до апаратного пристрою. Вони не обов’язково дозволяють програмам читати або записувати по одному символу за раз — це залежить від конкретного пристрою. Наприклад, символьний пристрій для жорсткого диска зазвичай вимагає, щоб усі операції читання і запису були вирівняні по межах блоків, і точно не дозволяє читати один байт.

Символьні пристрої іноді називають сирими (raw) пристроями, щоб уникнути плутанини, пов’язаної з тим, що символьний пристрій для апаратури з блочною організацією зазвичай змушує програми читати й записувати вирівняними блоками.

Блокові пристрої Блокові спеціальні файли або блокові пристрої надають буферизований доступ до апаратних пристроїв і забезпечують певний рівень абстракції від їхніх особливостей. На відміну від символьних пристроїв, блокові пристрої завжди дозволяють програмісту читати або записувати блок будь-якого розміру (включно з одиничними символами/байтами) та з будь-яким вирівнюванням.

Недоліком є те, що через буферизацію програміст не знає, коли саме записані дані буде передано з буферів ядра на реальний пристрій і в якому порядку два окремі записи потраплять на фізичний носій. Крім того, якщо одне й те саме апаратне забезпечення має і символьний, і блоковий пристрої, існує ризик пошкодження даних, оскільки клієнти, що використовують символьний пристрій, можуть не знати про зміни, зроблені в буферах блокового пристрою.

Більшість систем створюють і блокові, і символьні пристрої для представлення такого обладнання, як жорсткі диски. Однак FreeBSD і Linux є помітними винятками: перша система вилучила підтримку блокових пристроїв, тоді як друга створює лише блокові пристрої. Щоб отримати ефект символьного пристрою з блокового пристрою в Linux, його потрібно відкривати з Linux-специфічним прапорцем O_DIRECT.

Псевдопристрої Вузли пристроїв у Unix-подібних системах не обов’язково повинні відповідати фізичним пристроям. Вузли, які не мають такого відповідника, називаються псевдопристроями. Вони надають різноманітні функції, що обробляються операційною системою. До найуживаніших (символьних) псевдопристроїв належать:

приймає та відкидає всі дані, записані в нього; під час читання повертає end-of-file. приймає та відкидає всі дані, записані в нього; під час читання безперервно видає null characters (байти зі значенням 0). ід час читання безперервно видає нульові символи (байти зі значенням 0), а під час спроби запису генерує помилку («диск заповнений»). видає байти, згенеровані криптографічно стійким псевдовипадковим генератором ядра. Точна поведінка залежить від реалізації; іноді також надаються варіанти /dev/urandom або /dev/arandom. , , оступ до стандартних потоків процесу. n доступ до файлового дескриптора процесу з номером n. посилання на керуючий термінальний пристрій поточного процесу (якщо він існує), незалежно від того, чи має процес відкриті файлові дескриптори, що на нього вказують.

Стандарт POSIX вимагає наявності лише трьох спеціальних файлів пристроїв за іменами: /dev/console, /dev/null і /dev/tty, але не вимагає, щоб /dev/console був читабельним або записуваним. Повноцінна система зазвичай містить значно більше таких вузлів.

Крім того, BSD-специфічні псевдопристрої з інтерфейсом ioctl можуть також включати:

дозволяє процесам у просторі користувача керувати PF через інтерфейс ioctl. надає доступ через ioctl до пристроїв, які інакше не представлені вузлами в /dev; використовується утилітою bioctl для реалізації керуванняRAID в OpenBSD та NetBSD. ву NetBSD для моніторингу апаратного забезпечення; у просторі користувача доступ здійснюється через proplib(3) утилітою envstat.

Створення вузла Вузли створюються за допомогою системного виклику mknod. Командний рядок для створення вузлів також має назву mknod.

Вузли можна переміщати або видаляти за допомогою звичайних системних викликів файлової системи (rename, unlink) та відповідних команд (mv, rm).

Деякі версії Unix містять скрипт makedev або MAKEDEV, призначений для створення всіх необхідних пристроїв у каталозі /dev. Його використання має сенс лише в системах, де пристроям статично призначаються major-номери (наприклад, шляхом жорсткого зашивання їх у модулі ядра).

Інші Unix-системи, зокрема FreeBSD, використовують керування вузлами пристроїв на рівні ядра через devfs і не підтримують ручне створення вузлів. Системний виклик mknod(2) і команда mknod(8) існують для збереження сумісності з POSIX, але вручну створені вузли пристроїв поза devfs взагалі не працюватимуть.

Правила іменування У ієрархії /dev для назв деяких пристроїв використовуються префікси, які вказують на тип пристрою:

: лінійні принтери (порівн. lp) : псевдотермінали : термінали

Деякі додаткові префікси набули поширення в окремих операційних системах:

fb — фреймбуфер fd — (платформні) дисководи гнучких дисків; водночас це скорочення також часто означає file descriptor hd — («класичний») драйвер IDE (раніше використовувався для жорстких дисків ATA, оптичних приводів ATAPI тощо) hda — основний пристрій на першому каналі ATA (зазвичай major 3, minor 0) hdb — вторинний пристрій на першому каналі ATA hdc — основний пристрій на другому каналі ATA hdd — вторинний пристрій на другому каналі ATA parport, pp — паралельні порти mem — основна пам’ять (символьний пристрій) nbd — мережевий блоковий пристрій; абстракція для блокових пристроїв, змонтованих через мережу (або з образів за допомогою qemu-nbd)

Драйвер NVMe:

nvme0 — контролер першого зареєстрованого пристрою (символьний пристрій) nvme0n1 — перший простір імен першого пристрою (блоковий пристрій) nvme0n1p1 — перший розділ першого простору імен (блоковий пристрій)

Драйвер MMC:

mmcblk — драйвер носіїв MMC (SD-карти, чипи eMMC у ноутбуках тощо) mmcblk0 — перший зареєстрований пристрій mmcblk0p1 — перший розділ першого пристрою

Драйвер SCSI (також використовується libATA — сучасний драйвер PATA/SATA, USB, IEEE 1394 тощо):

sd — драйвер пристроїв масового зберігання (блоковий пристрій) sda — перший зареєстрований пристрій sdb, sdc тощо — другий, третій і наступні пристрої ses — драйвер корпусів (enclosure) sg — універсальний (generic) рівень SCSI sr — драйвер «ROM» (оптичні дисководи з доступом до даних; scd — другий псевдонім) st — драйвер магнітних стрічок tty — термінали ttyS — (платформний) драйвер послідовних портів ttyUSB — USB–послідовні перетворювачі, модеми тощо