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 lp    sys    6, 0 Feb 23 19:17 /dev/lp0

Здесь для файла /dev/hdc старший и младший номера - 22 и 0, а для файла /dev/lp0 - 6 и 0. Обратите внимание, что эти номера уникальны для каждой категории файлов, это означает, что может существовать файл символьного режима со старшим номером 22 и младшим 0. Аналогичным образом может существовать файл блочного режима со старшим номером 6 и младшим 0. Причина существования этих номеров довольно проста: они позволяют ядру связывать соответствующие операции с этими файлами (т.е. с периферийными устройствами, на которые эти файлы ссылаются): вы не работаете с дисководом таким же образом, как, скажем, с жестким диском SCSI.