/bin/sh
, необходимы для работы. Во время раскрутки системы все файловые системы проверяются на целостность (см. icheck(8)
или fsck(8)
) и подключаются к корню иерархии файлов. Эта операция подключения называется присоединением и является программистским эквивалентом операции установки пакета дисков на накопитель; обычно она выполняется только суперпользователем. После присоединения /dev/rp01
в качестве /usr
файлы пользователей становятся доступными, как если бы они были частью корневого каталога.Для обычного пользователя детали операции присоединения подсистемы файлов представляют мало интереса, но здесь есть несколько моментов, относящихся к нашей теме. Во-первых, поскольку подсистемы файлов могут быть присоединены и отсоединены, недопустимо устанавливать связь с файлом из другой подсистемы. Например, нельзя связать программы из общего каталога
/bin
с какими-то файлами из каталогов /bin
пользователей, поскольку /usr
находится в иной подсистеме файлов, чем /bin
:$ ln /bin/mail /usr/you/bin/m
ln: Cross-device link
$
Проблема могла возникнуть и потому, что значения индексных дескрипторов иногда совпадают в различных файловых системах.
Далее, каждая подсистема ограничена по размеру (числу доступных блоков для файлов) и числу индексных дескрипторов. Если подсистема заполнена, то невозможно расширять файлы в такой системе, пока не будет добавлено какое-то пространство. Команда
df
("disc free space" — свободное пространство диска) выдает сообщение о доступном пространстве в присоединенной подсистеме файлов:$ df
/dev/rp00 1989
/dev/rp01 21257
В каталоге
/usr
имеется 21257 свободных блоков. Достаточно ли этого пространства или наступил кризис, зависит от того, как система используется; в одних случаях требуется больше свободного пространства, в других — меньше. Кстати, из всех команд df
, вероятно, обеспечивает наибольшее разнообразие в формате вывода. Результат действия вашей команды df
может выглядеть совершенно иначе.Рассмотрим теперь некоторые более общие понятия. При входе в систему вы устанавливаете связь вашего терминала с системой и, значит, получаете в каталоге
/dev
файл, через который передаются вводимые и принимаемые вами символы. Команда tty
сообщает, какой терминал вы используете:$ whoami
you tty0 Sep 28 01:02
$ tty
/dev/tty0
$ ls -l /dev/tty0
crw--w--w- 1 you 1, 12 Sep 28 02:40 /dev/tty0
$ date >/dev/tty0
Wed Sep 28 02:40:51 EDT 1983
$
Заметьте, что вы владелец устройства и только у вас есть право на чтение с него. Иными словами, никто не может непосредственно читать вводимые вами символы, но выводить на ваш терминал может любой. Во избежание этого можно изменить права доступа к устройству, запретив тем самым другим использовать программу
write
для прямой записи или просто воспользоваться командой mesg
.$ mesg n
Запретим сообщения$ ls -l /dev/tty0
crw--w---- 1 you 1, 12 Sep 28 02:41 /dev/tty0
$ mesg y
Разрешим$ ls -l /dev/tty0
crw--w--w- 1 you 1, 12 Sep 28 02:42 /dev/tty0
$
Часто бывает удобно использовать имя для ссылки на применяемый терминал, но трудно определить, каково имя вашего терминала. Имя устройства
/dev/tty
является синонимом имени терминала, с которого вы вошли в систему, с каким бы терминалом вы ни работали на самом деле:$ date >/dev/tty
Wed Sep 28 02:42:23 EDT 1983
$
Имя
/dev/tty
особенно полезно, если программе необходимо начать диалог с пользователем, в то время когда ее стандартный входной и выходной потоки связаны с файлами, а не с терминалом. Команда crypt
является одной из команд, использующих имя /dev/tty
. "Открытый" текст поступает из стандартного входного потока, а зашифрованная информация направляется в стандартный выходной поток, поэтому команда crypt
читает ключ для шифрования с /dev/tty
:$ crypt cryptedtext
Enter key:
Введите ключ шифрования$
В данном примере имя
/dev/tty
используется неявно, но все-таки используется. Если бы команда crypt
читала ключ из стандартного входного потока, она бы прочла первую строку из файла cleartext
. Вместо этого она открывает файл /dev/tty
, отключает автоматическое эхо вводимых символов, чтобы ваш ключ не появился на экране, и читает ключ. В гл. 5 и 6 приводится несколько других примеров использования /dev/tty
.Иногда вы хотите запустить программу, но вам не важен результат ее выполнения. Например, вы могли уже ознакомиться с сегодняшними новостями и не желаете читать их еще раз. Переключение вывода команды
news
в файл /dev/null
приведет к игнорированию выходного потока:$ news >/dev/null
$
Информация, направляемая в
/dev/null
, просто пропадает, а программы, читающие из этого файла, сразу получают символ конца файла, поскольку программа чтения всегда возвращает 0 прочитанных байтов.Обычно файл
/dev/null
используют, чтобы отказаться от стандартного выходного потока и сделать видимыми диагностические сообщения. Например, команда time
(time(1)
) сообщает об использованном программой процессорном времени. Результат выдается в стандартный поток диагностики, так что можно хронометрировать команды, производящие преобразование входного потока в выходной, переключая стандартный выходной поток в файл /dev/null
:$ ls -l /usr/diet/words
-r--r--r-- 1 bin 196513 Jan 20 1979 /usr/dict/words
$ time grep e /usr/dict/words/ >/dev/null
real 13.0
user 9.0
sys 2.7
$ time egrep e /usr/dict/words >/dev/null
real 8.0
user 3.9
sys 2.8
$
Команда
time
выдает прошедшее календарное время, время процессора, затраченное программой, и время процессора, затраченное ядром системы для выполнения запросов программы. Команда egrep
— это мощный вариант команды grep, который мы обсудим в гл. 4; она выполняется почти в два раза быстрее команды grep при просмотре больших файлов. Если бы выдача команд egrep
или grep
не была переключена в /dev/null
или текущий файл, пришлось бы ждать, пока сотни тысяч символов "пробегут" на экране, прежде чем появятся нужные нам временные характеристики.Упражнение 2.9Познакомьтесь с другими файлами каталога
/dev
, прочитав разд. 4 справочного руководства. В чем состоит разница между /dev/mt0
и /dev/rmt0
? Прокомментируйте возможную пользу применения вложенных каталогов в /dev
для дисков, магнитных лент и т.п.Упражнение 2.10Магнитные ленты, записанные в других системах, обычно имеют другие размеры блоков, такие, как 800 байт — десятикратный образ перфокарты из 80 символов, но устройство
/dev/mt0
предполагает блоки из 512 байт. Обратитесь к команде dd
(dd(1)
), чтобы узнать, как читать такую ленту.Упражнение 2.11Почему
/dev/tty
не является просто связью с терминалом, с которого вы вошли в систему? Что бы произошло, если бы права доступа для него были