Как уже говорилось, такими файлами могут быть любые файлы, созданные системой или периферийными устройствами на вашей машине. Мы также упомянули, что содержимое файлов блочного режима буферизируется, а файлы символьного режима не буферизируются. Для демонстрации этого вставьте дискету в дисковод и введите дважды следующую команду:
$ dd if=/dev/fd0 of=/dev/null |
Как вы видите, происходит следующее: при первом исполнении команды содержимое дискеты было прочитано полностью, при вторичном выполнении команды физического обращения к дисководу не произошло. Такой эффект наблюдается потому, что содержание дискеты было буферизировано при первом выполнении команды – и вы не сменили дискету в дисководе.
А теперь, таким же образом попробуем отпечатать большой файл (это должно работать):
$ cat /a/big/printable/file/somewhere >/dev/lp0 |
Команда будет выполняться медленно, независимо от того запустили вы ее один раз, два раза или пятьдесят раз. Это происходит потому, что /dev/lp0 это файл символьного режима, и его содержимое не буферизируется.
Тот факт, что файлы блочного режима буферизированы, имеет хороший побочный эффект: кроме того, что буферизируется чтение, также буферизируется и запись. Это приводит к тому, что запись на диск происходит асинхронно: в момент когда вы записываете файл, немедленной записи на диск не происходит. Реально запись на диск произойдет только тогда, когда GNU/Linux примет решение о необходимости этого.
Каждый из специальных файлов имеет главный и вторичный номер. При выполнении команды ls -l эти номера отображаются на месте размера файла, так как размер для таких файлов не может быть вычислен:
ls -l /dev/hda /dev/lp0 brw-rw---- 1 root disk 3, 0 May 5 1998 /dev/hda crw-rw---- 1 root daemon 6, 0 May 5 1998 /dev/lp0 |
Здесь главный и вторичный номер для файла /dev/hda будут 3 и 0 соответственно, а для файла /dev/lp0, это будут числа 6 и 0. Обратите внимание, что эти номера уникальны в категории файла, что означает, что может существовать файл символьного режима с главным номером 3, и младшим 0 (этот файл фактически существует: /dev/ttyp0), и точно так же может быть файл блочного режима с главный номером 6 и младшим 0. Эти номера существуют для того чтобы GNU/Linux могла правильно связывать операции с этими файлам (то есть это указатели на периферийные устройства): вы обычно не работаете с дисководом таким же образом, как и (например) с жесткими дисками SCSI