Как уже отмечалось, такие файлы создаются либо системой, либо периферийными устройствами вашей машины. Мы также упоминали, что содержимое файлов блочного режима буферизуется, а файлы символьного режима не буферизуются. Чтобы продемонстрировать это, вставьте дискету в дисковод и дважды введите следующую команду:
$ 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.