Как уже отмечалось, такие файлы создаются либо системой, либо периферийными устройствами вашей машины. Мы также упоминали, что содержимое файлов блочного режима буферизуется, а файлы символьного режима не буферизуются. Чтобы продемонстрировать это, вставьте дискету в дисковод и дважды введите следующую команду:
$ dd if=/dev/fd0 of=/dev/null |
Вы должны были увидеть следующее: при первом запуске команды было прочитано все содержимое дискеты. После второго запуска команды обращения к дисководу не было вообще. Это происходит потому, что содержимое дискеты было буферизовано при первом выполнении команды –– а вы ничего не изменяли на дискете перед вторым запуском команды.
А теперь, если вы хотите распечатать большой файл таким способом (да, это будет работать):
$ cat /большой/пригодный/для/распечатки/файл/где-то >/dev/lp0 |
Выполнение команды займет столько времени, сколько ей потребуется, независимо от того, сколько раз вы ее запускали: один, два или пятьдесят. Это связано с тем, что /dev/lp0 - это файл символьного режима, и его содержимое не буферизуется.
Явление буферизации файлов блочного режима обладает хорошим побочным эффектом: буферизуется не только чтение, но и запись. Это позволяет записи на диск выполняться асинхронно: когда вы записываете на диск файл, операция самой записи не происходит немедленно. Она произойдет тогда, когда ядро Linux решит выполнить запись на устройство.
И в заключение, каждый специальный файл имеет старший и младший номера. В информации, выводимой командой ls -l они отображаются на месте размера файла, т.к. размер для таких файлов носит несущественный характер:
ls -l /dev/ide/host0/bus0/target0/lun0/disc /dev/printers/0 brw------- 1 root root 3, 0 dic 31 1969 /dev/ide/host0/bus0/target0/lun0/disc crw-rw---- 1 lp sys 6, 0 dic 31 1969 /dev/printers/0 |
Здесь для файла /dev/hda старший и младший номера - 3 и 0, а для файла /dev/lp0 - 6 и 0. Обратите внимание, что эти номера уникальны для каждой категории файлов, это означает, что может существовать файл символьного режима со старшим номером 3 и младшим 0 (этот файл существует на самом деле: /dev/ttyp0), а также может существовать файл блочного режима со старшим номером 6 и младшим 0. Причина существования этих номеров довольно проста: они позволяют ядру связывать соответствующие операции с этими файлами (т.е. с периферийными устройствами, на которые эти файлы ссылаются): вы не работаете с дисководом таким же образом, как, скажем, с жестким диском SCSI.