Брайан Керниган - UNIX — универсальная среда программирования
- Название:UNIX — универсальная среда программирования
- Автор:
- Жанр:
- Издательство:Финансы и статистика
- Год:1992
- Город:Москва
- ISBN:5-289-00253-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Брайан Керниган - UNIX — универсальная среда программирования краткое содержание
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.
Для программистов-пользователей операционной системы UNIX.
UNIX — универсальная среда программирования - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
$ /etc/mount
rp01 on /usr
$
В нашем случае каталог root находится на /dev/rp00
(хотя команда /etc/mount
об этом не сообщает), а файловая система пользователей, т.е. файлы из каталога /usr
и вложенных каталогов, находится на /dev/rp01
.
Каталог /root
должен быть доступен системе для выполнения команд. Каталоги /bin
, /dev
и /etc
всегда находятся в корневом каталоге, поскольку при запуске системы доступны только файлы корневого каталога, а такие, как /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
или текущий файл, пришлось бы ждать, пока сотни тысяч символов "пробегут" на экране, прежде чем появятся нужные нам временные характеристики.
Интервал:
Закладка: