На багатьох пристроях основними операціями є пересилання байтів з комп'ютера на периферію або отримання байтів з периферії на комп'ютер. Такі пристрої схожі на труби і добре працюють як символьні пристрої . Для операцій, які не читають і не записують (наприклад, контроль потоку в послідовному рядку), пристрій надає спеціальні команди під назвою ioctl .
Деякі пристрої дуже схожі на звичайні файли: вони складаються з обмеженої кількості байтів, і те, що ви записуєте в заданій позиції, згодом можна прочитати з тієї ж позиції. Ці пристрої називаються блоковими пристроями .
Мережеві інтерфейси складніші: те, що вони читають і записують, - це не байти, а пакети. Хоча все-таки можна було б використовувати звичайний інтерфейс з, read
і write
це було б незручно: імовірно, кожен виклик write
надсилав би пакет, а кожен виклик отримував read
би пакет (і якщо буфер занадто малий, щоб пакет міг вміститися, пакет буде втрачено).
Мережеві інтерфейси можуть існувати лише як пристрої, що надають ioctl
. Насправді це роблять деякі варіанти Unix, але не Linux. У цьому підході є певна перевага; наприклад, в Linux мережеві інтерфейси можуть використовувати udev . Але переваги обмежені, тому цього не було зроблено.
Більшість програм, пов’язаних з мережею, не цікавляться індивідуальними мережевими інтерфейсами, вони працюють на більш високому рівні. Наприклад, веб-браузер хоче встановити TCP-з'єднання, а веб-сервер хоче прослуховувати TCP-з'єднання. Для цього корисні пристрої для мережевих протоколів високого рівня, наприклад
{ echo $'GET http://www.google.com/ HTTP/1.0\r';
echo $'Host: www.google.com\r';
echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80
Насправді ksh та bash забезпечують такий інтерфейс для клієнтів TCP та UDP. Однак у цілому мережеві програми складніші, ніж додатки для доступу до файлів. Хоча більшість обміну даними ведеться з дзвінками, аналогічними read
та write
встановленням з'єднання, вимагає більше інформації, ніж просто ім'я файлу. Наприклад, прослуховування TCP-з'єднань виконує два етапи: один повинен бути виконаний, коли сервер починає прослуховувати, і один, який повинен виконуватися щоразу, коли клієнт підключається. Такі додаткові кроки не вписуються добре в API файлу, що є основною причиною того, що в мережі є свій власний API.
Інший клас пристроїв, який, як правило, не має записів в /dev
Linux (але є в інших варіантах Unix), - це відеоадаптери. В принципі, прості відеоадаптери можуть бути викриті у вигляді пристроїв кадрів , які можуть бути блоковими пристроями з блоків, що представляють колір кожного пікселя. Прискорені відеоадаптери можуть бути представлені як символьні пристрої, на які програми надсилають команди. Тут недолік інтерфейсу пристрою полягає в тому, що він повільний: програмі, що відображає (на практиці X-сервер) потрібно було б робити дзвінки ядра щоразу, коли щось відображається. Замість цього відбувається те, що сервер X здебільшого записує безпосередньо у пам'ять відеоадаптера, оскільки це швидше.