5. Спеціальні файли: файли символьного і блокового режиму

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

$ dd if=/dev/fd0 of=/dev/null

Ви мали б побачити наступне: при першому запуску команди було прочитано увесь вміст дискети. Після другого запуску команди звернення до дисководу не було взагалі. Це відбувається тому, що вміст дискети було буферизовано при першому виконанні команди, а ви нічого не змінювали на дискеті перед другим запуском команди.

А тепер, якщо ви хочете роздрукувати великий файл таким чином (так, це спрацює):

$ cat /великий/файл/для/друку/десь/там >/dev/lp0

Виконання команди займе стільки часу, скільки їй знадобиться, незалежно від того, скільки разів ви її запускали: один, два чи п'ятдесят. Це пов'язано з тим, що /dev/lp0 - це файл символьного режиму і його вміст не буферизується.

Явище буферизації файлів блокового режиму має хороший побічний ефект: буферизується не тільки читання, а й запис. Це дозволяє записам на диск виконуватися асинхронно: коли ви записуєте на диск файл, операція самого запису не відбувається негайно. Вона станеться тоді, коли ядро Linux вирішить виконати запис на пристрій. Звісно, якщо потрібно, ви можете перевизначити це для певної файлової системи. Для одержання докладнішою інформації погляньте на опції sync і async на сторінці керівництва mount(8), а також у Параграф 7, “Атрибути файлів”.

І нарешті кожен спеціальний файл має старший і молодший номери. У інформації, що виведено командою ls -l, вони відображаються на місці розміру файла, бо розмір для таких файлів має несуттєвий характер:

$ ls -l /dev/hdc /dev/lp0 
brw-rw----  1 queen cdrom 22, 0 Feb 23 19:18 /dev/hdc
crw-rw----  1 root root 6, 0 Feb 23 19:17 /dev/lp0

Here, the major and minor of /dev/hdc are 22 and 0, whereas for /dev/lp0, they are 6 and 0. Note that these numbers are unique per file category, which means that there can be a character mode file with major 22 and minor 0, and similarly, there can be a block mode file with major 6 and minor 0. These numbers exist for a simple reason: it allows the kernel to associate the correct operations to these files (that is, to the peripherals these files refer to): you don't handle a floppy drive the same way as, say, a SCSI hard drive.