“Специальные” Файлы: Символьный режим и Блочный режим

Как уже говорилось, такими файлами могут быть любые файлы, созданные системой или периферийными устройствами на вашей машине. Мы также упомянули, что содержимое файлов блочного режима буферизируется, а файлы символьного режима не буферизируются. Для демонстрации этого вставьте дискету в дисковод и введите дважды следующую команду:

$ 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



Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости