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.