Страница:
пустивший данный shell, имеет более низкий идентификатор, чем сам про-
цесс. Цель заключается в том, чтобы предоставить возможность обычным
пользователям запускать данный процесс, давая им временно права супер-
пользователя. (Не оставляйте исходный текст этой программы в системе,
поскольку кто-то может превратить ее в "лазейку" и перекомпилировать
ее - в главе 9 мы увидим такого рода дыры в системе защиты.)
Строка 14 запускает shell. Аргументом этого shell является строка
"ulimit sh". Эта строка будет выведена на экран, если мы выполним ко-
манду "ps -ef". Данный shell имеет новое значение ulimit.
Возможность изменить значение ulimit позволяет нам определить на-
ибольший возможный размер файла. Создание одного или нескольких таких
файлов максимального размера полезно в целях тестирования. Например,
полезно выяснить, сколько данных может содержать гибкий диск без пере-
полнения или что произойдет, когда система выйдет за пределы свободных
блоков. Мы хотим понять, как ведет себя система в таких ситуациях.
-------------------------------------------------------------
ИМЯ: umntsys
-------------------------------------------------------------
umntsys
Размонтирование всех файловых систем, смонтированных в данный мо-
мент.
umntsys
umntsys Размонтирует все смонтированные файловые системы
1 :
2 # @(#)umntsys v1.0 Unmount all file systems Author: Russ Sage
Размонтирование всех файловых систем
4 if [ "$#" -gt 0 ]
5 then echo "umntsys: too many arguments" >&2
6 echo "usage: umntsys" >&2
7 exit 1
8 fi
10 /etc/mount | sed -n -e '/^\/ /d' -e 's/^.* on \(.*\)
read.*/umount \1/p' | sh -
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ umntsys?
Иногда возникают ситуации, когда вы как администратор хотели бы
запустить систему в однопользовательском режиме. Например, вы хотите
сменить или установить жесткие диски и вам нужно, чтобы никто не имел
доступа к этому устройству, пока вы с ним работаете. Вам может также
понадобиться запустить систему в минимальной конфигурации с целью ло-
кализации какой-то проблемы. Поскольку выполнение операций завершения
работы системы и перезагрузки представляет собой довольно длительную
процедуру, было бы лучше иметь способ сохранить систему работающей, но
переключить в однопользовательский режим, а затем быстро перезапустить
многопользовательский режим, чтобы свести к минимуму неудобства поль-
зователей. Для того чтобы сделать это, нам нужно понять концепцию
"уровней работы системы" и использовать их.
Уровень работы (run level) в системе UNIX представляет собой
состояние или конфигурацию, в которой может быть машина. Фактически
это число, которое определяет, какие возможности системы включены или
отключены и находится ли система в одноили многопользовательском режи-
ме. Описание того, что происходит на каждом уровне работы системы, со-
держится в файле /etc/inittab. Обычно изменение уровня работы системы
включает в себя переход от многопользовательского режима (например,
уровень 6), к однопользовательскому режиму (уровень S).
Одним из побочных эффектов перехода от многопользовательского ре-
жима к однопользовательскому является то, что все дополнительные фай-
ловые системы размонтируются. Единственной смонтированной файловой
системой является корневая (определенная как /dev/root, /dev/hd0a и
т.п.). Ее никогда нельзя размонтировать. Когда происходит переход об-
ратно к многопользовательскому режиму, файловые системы обычно повтор-
но монтируются с помощью файла /etc/rc.
Мы можем эмулировать однопользовательский режим путем прекращения
выполнения всех процессов в системе командой kill и размонтирования
всех файловых систем. Командный файл umntsys предназначен для этой це-
ли.
ЧТО ДЕЛАЕТ umntsys?
Командный файл umntsys представляет собой набор конвейерных про-
цессов, которые в конечном итоге выполняют размонтирование всех смон-
тированных в данный момент файловых систем. Корневая файловая система
распознается как особая, поэтому не делается попытка размонтировать
ее. Также исключается попытка размонтировать немонтированные файловые
системы.
Первым делом командный файл umntsys проверяет отсутствие аргумен-
тов в командой строке. Поскольку для него не существует опций, команд-
ная строка должна быть пустой. Если количество аргументов больше нуля,
это ошибка, поэтому на стандартное устройство регистрации ошибок выво-
дится сообщение об ошибке, и программа завершается.
Вся работа выполняется в строке 10. Этот оператор похож на вол-
шебное заклинание. Начинается он с выполнения обычной команды mount
без аргументов. По умолчанию команда mount выводит таблицу с информа-
цией обо всех каталогах и именах устройств монтированных файловых
систем. Эта таблица выглядит примерно так:
-----------------------
|
| / on /dev/hd0a read/write on Mon Jan 06 09:53:03 1986
| /tmp on /dev/hd01 read/write on Mon Jan 06 09:53:03 1986
| /usr on /dev/hd02 read/write on Mon Jan 06 09:53:03 1986
| /u1 on /dev/hd03 read/write on Mon Jan 06 09:53:03 1986
| /u2 on /dev/hd04 read/write on Mon Jan 06 09:53:03 1986
| /u3 on /dev/hd05 read/write on Mon Jan 06 09:53:03 1986
| /mnt on /dev/fd01 read/write on Mon Jan 06 09:54:41 1986
|
Когда файловая система смонтирована, требуются и каталог, и имя
устройства. Когда файловая система не смонтирована, используется толь-
ко имя устройства. Нам нужно вырезать имена устройств из таблицы мон-
тирования и вставить их в команду umount. Это делается с помощью ко-
манды sed.
Команда sed начинает работать с опцией -n, которая подавляет вы-
полняемый по умолчанию вывод на экран, поэтому ничего не выводится,
пока мы не попросим. Мы можем использовать это в своих интересах, от-
фильтровывая ненужные нам строки. Первой коррекцией таблицы смонтиро-
ванных файловых систем является избавление от записи о корневой файло-
вой системе, поскольку мы бы не хотели пытаться ее размонтировать.
Поскольку корневой файловой системе соответствует каталог "/", мы мо-
жем использовать его в качестве ключа. Выражение в операторе sed озна-
чает: "Искать с начала строки первый символ наклонной черты (поскольку
этот символ имеет специальное значение, он экранирован обратной косой
чертой) и пробел за ним. Когда наклонная черта найдена, удалить ее".
Данный шаблон поиска соответствует только записи о корневой файловой
системе.
Следующая операция редактирования выполняется более замысловато.
Она использует возможность группирования регулярных выражений и после-
дующей ссылки на них по номеру, что вы уже видели в некоторых наших
предыдущих командных файлах. Данный синтаксис (регулярное выражение)
предназначен для группирования символов и последующей ссылки на них с
помощью номера \n. Фокус в том, чтобы выделить только имя устройства и
сгруппировать его, что и делает команда подстановки sed'а. Первое вы-
ражение означает: "От начала строки распознать любой символ, за кото-
рым следует любое количество любых символов, пробел и слово `on';
сгруппировать следующие символы вплоть до пробела, слово `read' и все
символы после него". В результате всего этого выделяется имя уст-
ройства и помещается во временную переменную, чтобы впоследствии к ней
можно было обратиться.
Вторая часть подстановки создает новую строку взамен исходной.
Эта строка состоит из слова "umount", пробела, затем группового выра-
жения номер 1, которое представляет собой временную переменную, содер-
жащую имя устройства. В результате всех этих действий таблица смонти-
рованных файловых систем (за исключением записи о корневой системе)
превращается в набор команд размонтирования с именами устройств в ка-
честве аргументов. Полученный результат имеет примерно такой вид:
-------------------
|
| umount /dev/hd0a
| umount /dev/hd01
| umount /dev/hd02
| umount /dev/hd03
| umount /dev/hd04
| umount /dev/hd05
| umount /dev/fd01
|
Теперь эти команды по конвейеру передаются другому shell ("sh
-"). Символ "-" указывает shell, что свои команды он должен получать
со стандартного ввода, а в данном случае это наши команды umount, пе-
реданные по конвейеру. Они размонтируют все файловые системы.
------------------------------------------------------------
ИМЯ: lrgf
------------------------------------------------------------
lrgf Создает файл максимально возможного размера
Выполняет операции записи в файл до тех пор, пока не обнаружится
граница размера файла.
lrgf
lrgf Определение границы размера файла
1 char id[] =
"@(#) lrgf v1.0 Create the largest file Author: Russ Sage
Создать файл максимального размера
3 #include
4 #include
5 #include
6 #include
8 #define FSIZ 512
9 #define BSIZ 1024
11 long ulimit();
12 char buf[BSIZ];
14 main()
15 {
16 register int n, fd, bcnt;
17 char file[FSIZ];
19 for (bcnt=0; bcnt
20 buf[bcnt]='x';
22 printf("\nMax file size: %ld bytes\n\n",
ulimit(UL_GFILLIM,0L)*512);
24 printf("filename to write to: ");
25 scanf("%s",file);
26 printf("\n");
28 if ((fd=open(file,O_RDRW|O_CREAT|O_TRUNC, 0644)) < 0)
29 {
30 perror("\nopen");
31 exit(1);
32 }
34 for (bcnt=0; ;bcnt++)
35 {
36 if ((n=write(fd, buf, BSIZ)) < 0)
37 {
38 perror("\nwrite");
39 break;
40 }
41 printf("block count: %d bytes written: %d\r",bcnt,n);
42 }
43 printf("\nend of program\n");
44 }
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖНА ПРОГРАММА lrgf?
Как обсуждалось ранее, нам необходимо знать, что происходит, ког-
да UNIX достигает каких-то пределов. Не только пределов размера файла,
а любых пределов. Примерами предельных значений являются количество
процессов, которые вы можете запустить, общее количество процессов в
системе, количество файлов, которые вам разрешено открыть, количество
свободных блоков, количество индексных дескрипторов, глубина вложен-
ности каталогов, при которой еще возможна работа, и т.д.
Нам нужна программа, создающая файл максимального размера. Затем
мы можем использовать этот файл для проверки различных пределов, имею-
щих отношение к файлам.
ЧТО ДЕЛАЕТ lrgf?
Lrgf - это программа, которая создает файл максимально возможного
размера. Выполняется это путем записи в файл до тех пор, пока команда
записи не окончится неудачей. Это означает, что в данный файл больше
нельзя записать данные, и он достиг границы.
При вызове программа lrgf выводит сообщение, содержащее общее ко-
личество байтов, которое вы можете записать в файл. Это значение вы-
числяется по значению ulimit, поэтому оно разное для разных пользова-
телей и зависит от shell, с которым пользователь сейчас работает.
Затем у вас запрашивается имя файла. Вы можете указывать любое
имя, для которого вы имеете права записи. Одним из способов проверки
жесткого диска является запись одного из таких больших файлов в каждый
раздел диска и затем проверка отдельных файловых систем. После запуска
программы вы увидите строку с сообщением, которое постоянно обновля-
ется. Оно содержит общее число записанных блоков и количество байтов,
которое записывалось при каждой попытке записи. Программа lrgf записы-
вает в файл каждый раз по 1024 байта. В зависимости от вашего значения
ulimit количество байтов, дописываемых в конец файла, может не быть
равным в точности 1 Кб. Выходное сообщение постоянно печатается в од-
ной и той же строке, заменяя на экране старое значение. Это достига-
ется путем вывода только символа возврата каретки, а не перевода стро-
ки.
Когда программа не может больше записывать данные в файл, итого-
вое количество блоков выводится на экран. Это общее число блоков, за-
писанных в файл.
1. $ lrgf
/dev/rfd0
Ввод имени устройства в ответ на запрос имени файла, в который
будет производиться запись. При этом программа lrgf выполняет последо-
вательную запись на гибкий диск неструктурированных данных. Тем самым
проверяется, распознает ли драйвер устройства переполнение гибкого
диска. Это важно знать при работе с командой cpio, которая предполага-
ет, что драйвер устройства сообщит об остановке и запросе следующей
дискеты.
2. $ lrgf
/usr/tmp/lrg
Создание файла в файловой системе /usr. Большинство систем XENIX
используют каталог /usr как отдельную файловую систему, отличную от
корневой. Созданием файла в каталоге /usr /tmp мы можем проверить по-
ложение дел в этой часто используемой файловой системе.
3. $ lrgf
/tmp/lrg
В данном случае создаваемый файл займет место в корневой файловой
системе (если вы не имеете каталога /tmp в вашей собственной файловой
системе). Потребуется не слишком много таких файлов для заполнения
всех свободных блоков в корневой файловой системе.
4. $ lrgf
/mnt/lrg
Создание файла на гибком диске в предположении, что на гибком
диске имеется файловая система и она смонтирована в каталог /mnt.
5. $ F=0
$ while :
> do
> echo -r "--> Making file $F <--"
> ./lrgf <<-!
> $F
> !
> echo
> F=`expr $F + 1`
> done
Данный цикл запускает программу lrgf бесконечное число раз. Счет-
чиком является переменная F. Она должна быть предварительно установле-
на в нуль, чтобы shell рассматривал ее как число, а не как символьную
строку. Сначала выводится сообщение, содержащее имя создаваемого фай-
ла. Первым именем файла является 0. Программа lrgf запускается,
используя в качестве входных данных "данный документ" (т.е. сам ко-
мандный файл). В качестве ответа на вопрос об имени файла используется
значение $F. Значение переменной F увеличивается, и программа lrgf вы-
зывается снова. Именами файлов являются 0, 1, 2 и т.д. Это продолжа-
ется до тех пор, пока не останется больше свободного места. Вряд ли вы
будете пользоваться этим часто, но для тестирования это прекрасное
средство заполнить все свободное пространство. Если вы хотите увидеть,
что делает ваша система, когда исчерпаны свободные блоки, примените
данный командный файл.
Строки 3-6 включают все необходимые файлы заголовков. Эти файлы
содержат определения и метки, необходимые данной программе.
Строки 8 и 9 определяют размеры буфера для имен файлов и буфера
для записи на диск. Значение BSIZ можно поднастроить, если программа
работает слишком медленно. У вас может возникнуть желание увеличить
BSIZ до 4096, чтобы производилось не так много операций записи.
Строка 11 определяет возвращаемое значение системного вызова
ulimit как длинное целое. Строка 12 резервирует буфер, который должен
быть записан. Этот буфер находится вне основной части программы из-за
ограничений на размер внутри функций. В основном блоке программы наи-
большая область автоматической памяти, которую вы можете иметь, равна
размеру вашего стека. Вы можете сделать по-другому, объявив данный бу-
фер как статическую переменную в функции main. Мы решили вынести его
за пределы функции main и не объявлять как статическую переменную.
Строка 16 объявляет некоторые рабочие переменные. Заметим, что
они помещаются в регистры. Это сделано для ускорения работы программы
и получения более компактного объектного кода.
Строка 17 резервирует буфер, в который вы вводите имя файла.
Строки 19 и 20 заполняют записываемый буфер символами "x", поэто-
му после создания файла мы можем их там увидеть.
Строка 22 выводит значение ulimit для вашего процесса. Обратите
внимание, что вызов ulimit возвращает количество блоков, поэтому мы
должны умножить это число на 512. В результате мы получим общее коли-
чество байтов, которое может содержать файл.
Строки 24-26 запрашивают имя файла, читают его и подготавливают
экран для следующего сообщения. Строки 28-32 открывают файл с указан-
ным именем для получения дескриптора файла. Файл открывается для за-
писи и чтения, создается при необходимости и обрезается, если он уже
существует. Если операция открытия файла заканчивается неудачей, выво-
дится сообщение об ошибке, и программа завершается.
Строки 34-42 выполняют запись. Цикл for бесконечен, поскольку в
середине оператора нет проверки значения счетчика. Переменная bcnt
постоянно увеличивается, пока выполняется запись.
Строка 36 выполняет запись в файл. Если запись неудачна, выво-
дится сообщение об ошибке и по оператору break осуществляется выход из
цикла. Строка 41 выводит количество выполненных операций записи и ко-
личество записанных байтов. Обратите внимание, что данный оператор
print содержит возврат каретки (\r), а не перевод строки. Это позволя-
ет курсору оставаться в одной итемах.
экране поверх старых значений. Экран не скроллируется, что удобно для
наблюдения. Выполнение цикла продолжается до тех пор, пока системный
вызов write не закончится неудачей и оператор break не прекратит цикл.
Когда это происходит, выполнение продолжается со строки 43, которая
печатает "end of program". Выполнение команды "ls -l" для записанного
файла показывает, сколько байтов имеет файл максимального размера. Это
количество должно совпадать с числом, которое сообщила вам программа
lrgf.
В данной главе представлена лишь небольшая часть возможных ислле-
дований внутренней работы файловых систем и устройств в UNIX. Некото-
рые из представленных программ могут быть неприменимы в вашей версии
системы UNIX или в вашей конфигурации аппаратных средств или могут
выглядеть в вашей системе иначе. Однако общие принципы сохраняются, и
вы можете использовать рассмотренные средства в качестве основы для
ваших собственных исследований.
ВВЕДЕНИЕ
ФИЗИЧЕСКОЕ ПОДКЛЮЧЕНИЕ
ПОДКЛЮЧЕНИЕ БЕЗ КОММУНИКАЦИОННЫХ УСТРОЙСТВ
ДОСТУП МИКРО-ЭВМ ИЛИ ТЕРМИНАЛА К СИСТЕМЕ UNIX
ПРЯМОЕ ПОДКЛЮЧЕНИЕ
ДИСТАНЦИОННОЕ ПОДКЛЮЧЕНИЕ
ДОСТУП ИЗ СИСТЕМЫ UNIX К МИКРО-ЭВМ
ОБНАРУЖЕНИЕ МОДЕМОВ В СИСТЕМЕ
ИСПОЛЬЗОВАНИЕ И КОНФИГУРИРОВАНИЕ ЛИНИИ
ИЗМЕНЕНИЕ СКОРОСТЕЙ ОБМЕНА
ЗАХВАТ ДАННЫХ
ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА ДЛЯ КОММУНИКАЦИОННЫХ ЛИНИЙ
cuchk - Cu check - проверка свободной линии для cu
talk - Обращение к последовательному порту
ДОСТУП ИЗ UNIX В UNIX
СВЯЗЫВАНИЕ UNIX-МАШИН
ОБЛАСТИ ДЛЯ ПЕРЕДАВАЕМЫХ ФАЙЛОВ
СЕТЕВАЯ БЕЗОПАСНОСТЬ
ОГРАНИЧИТЕЛЬНЫЕ ФАЙЛЫ
ОТЛАДКА КОММУНИКАЦИЙ
uust Состояние uucp и служебные действия
uutrans Передача файловых деревьев из одной системы
UNIX в другую систему UNIX
КОНФИГУРАЦИОННЫЕ РЕШЕНИЯ
ПОДКЛЮЧЕНИЕ UNIX К МОДЕМУ И ГЛАВНОЙ МАШИНЕ
ПОДКЛЮЧЕНИЕ UNIX И ТЕРМИНАЛА К МОДЕМУ
ПОДКЛЮЧЕНИЕ UNIX К ТЕРМИНАЛУ, МОДЕМУ И ГЛАВНОЙ МАШИНЕ
СИСТЕМА UNIX, МИКРО-ЭВМ И МОДЕМ
АЛЬТЕРНАТИВНОЕ РЕШЕНИ
ТРИ СИСТЕМЫ UNIX
В данной главе мы рассматриваем средства коммуникации в системе
UNIX. В то время как в мире MS-DOS коммуникации ограничены обычно
"черным ящиком" (программными пакетами и довольно стандартными
модемами), коммуникации в системе UNIX более сложны. UNIX предлагает
несколько уровней коммуникаций, включая передачу файлов, удаленную
регистрацию в системе, дистанционную почту и развитые системы обмена
сообщениями, которые могут связывать между собой сотни систем UNIX.
Однако, в большинстве систем UNIX нет удобно оформленных,
управляемых с помощью меню средств коммуникации. Вместо этого имеются
сложные системные команды и необходимость поддерживать много файлов.
Обычно требуется также владеть многими подробностями конфигурации и
использования модемов. Мы предлагаем теоретическое обоснование и
практические рекомендации, а также инструментальные средства, которые
помогут вам освоить данный аспект системы UNIX и обеспечить
работоспособность коммуникаций в вашей системе. Мы рассмотрим не
только прямую связь между машинами, но и связь с удаленными
терминалами и модемами.
Сначала мы займемся физическими соединениями, что является
первым этапом установки линии связи. Мы рассмотрим модель интерфейса
RS232-C и выясним, как подключить прямую межмашинную связь.
Затем мы обсудим обращение к системе UNIX с микро-ЭВМ. Поговорим
о том, какие существуют виды протоколов и какие из них лучше
использовать.
Далее мы рассмотрим, как пользоваться модемом, чтобы вызвать из
UNIX другие системы, например доски объявлений и системы, отличные от
UNIX. Вы можете изучить, как найти все модемные соединения в системе,
подключиться к последовательному порту и управлять модемом. При
обращении к другой системе вы можете перехватить все данные,
поступающие на ваш терминал, и сохранить их в файле для последующего
использования. Командные файлы (cuchk и talk), представленные в
данном разделе, следят за доступностью линии связи и устанавливают
связь с модемом.
В завершение мы рассмотрим связь между системами UNIX с помощью
утилиты uucp. Мы увидим, как и куда передавать файлы между системами,
как файлы защиты данных управляют средой uucp и изучим способы
отладки механизма передачи файлов с помощью uucp. Здесь представлены
командные файлы uust для выполнения рутинной работы по обслуживанию
uucp и uutrans для копирования древовидной структуры каталогов из
одной системы в другую.
Большинство машин, на которых работает UNIX, имеют один или
несколько последовательных портов. Эти порты - глаза и уши машин,
позволяющие системе связываться с внешним миром. Их можно
использовать для подключения любого устройства с интерфейсом RS-232-C
и для связи или управления. В данном разделе мы рассмотрим, как
подключить интерфейс RS -232-C для обеспечения связи типа UNIX-UNIX,
терминал-UNIX и модем-UNIX.
Начнем с рассмотрения базовой модели RS-232-C, показанной на
рис. 8-1. Эта модель иллюстрирует, как могут общаться друг с другом
две машины и/или терминалы либо через модемы по телефонным линиям,
либо по прямой (проводной) связи. Хотя последующее обсуждение мы
ведем преимущественно в терминах телефонных соединений, те же базовые
принципы относятся и к прямой связи, за исключением того, что
коммуникационные устройства (DCE, data communication equipment) в
этом случае не нужны.
Рис. 8-1. Стандартная модель интерфейса RS-232-C
-------------------------------------------------------------------
_||_
+-------+ 2 ***** _||_ ***** 2 +-------+
| |------>* *----\ || /----* *<------| |
| DTE-1 | * DCE * \ || / * DCE * | DTE-2 |
| |<------* * / || \ * *------>| |
+-------+ 3 * *<---/ || \--->* * 3 +-------+
***** || *****
-------------------------------------------------------------------
На каждом конце находятся терминальные устройства, называемые
DTE (data terminating equipment). В роли DTE может выступать
терминал, например, VT-100, или центральный процессор микро-, мини-
или большой ЭВМ.
Каждое терминальное устройство DTE должно использовать
коммуникационное устройство DCE, называемое обычно модемом, для
модуляции и демодуляции сигналов, проходящих по телефонным линиям.
Каждое DTE использует вывод номер 2 для передачи данных и вывод номер
3 для получения данных. Поскольку то, что передано с вывода 2 на
каждой машине, принимается на выводе 3 другой машины, возникает
перекрещивание телефонных линий между устройствами DCE.
Подсоединение и обработка сигнала между DTE и DCE полностью
соответствуют стандарту RS-232-C. Аппаратный протокол позволяет DTE
использовать DCE для посылки и приема данных от другого DTE.
Кабель, связывающий физически DTE и DCE, называется
"прямолинейным" кабелем. Он позволяет устройству DTE посылать команды
(или сигналы с выводов) на DCE, а устройству DCE отправлять команды
обратно на DTE. Подключение DCE одной машины к DCE другой машины
производится через обычные телефонные линии.
Устройства DCE необходимы по той причине, что устройства DTE
являются цифровыми, а телефонные линии - аналоговыми. Единственный
способ передать цифровую информацию по аналоговым линиям -
закодировать цифровую информацию в аналоговый сигнал, послать этот
сигнал по телефонным линиям, а затем декодировать аналоговый сигнал
обратно в цифровую информацию.
Если ваши машины расположены довольно близко (в пределах 50
футов / 15 метров. Один фут составляет около 30.5 см. - Примеч.
перев./), вам не нужен модем, вы можете использовать кабель "нулевого
модема" вместо DCE. Кабель нулевого модема имитирует такой же
протокол, что и DCE, но не требует наличия модема для коммуникаций.
Основная задача подключения нулевого модема - обеспечить
перекрещивание между передающими и принимающими сигналами. На рис. 8-
2 показана общая схема подключения без устройств DCE.
Рис. 8-2. Конфигурация с нулевым модемом
-------------------------------------------------------------------
+-------+ 2 2 +-------+
| |------>... ...<------| |
| DTE | 3 \./ 3 | DTE |
| |<------.../ \...------>| |
+-------+ +-------+
-------------------------------------------------------------------
Для того чтобы выполнить подключение, имитирующее DCE, требуются
некоторые манипуляции с сигналами. Эти манипуляции также
стандартизованы в кабеле нулевого модема. По схеме этого кабеля,
показанной на рис. 8-3, рассмотрим, как он имитирует сигналы DCE.
Рис. 8-3. Кабель нулевого модема RS-232-C
-------------------------------------------------------------------
DTE-1 DTE-2
|| ||
ЗАЩИТНАЯ ЗЕМЛЯ 1 ||-------------------------|| 1
(PROTECTIVE GROUND) || ||
|| ||
СИГНАЛЬНАЯ ЗЕМЛЯ 7 ||-------------------------|| 7
(SIGNAL GROUND) || ||
|| ||
ПЕРЕДАЧА ДАННЫХ 2 ||----------\ /----------|| 2
(TRANSMIT DATA) || . ||
ПРИЕМ ДАННЫХ 3 ||<---------/ \--------->|| 3
(RECEIVE DATA) || ||
|| ||
ЗАПРОС ПЕРЕДАЧИ 4 ||----- -----|| 4
(REQUEST TO SEND) || | | ||
|| | | ||
ГАШЕНИЕ ПЕРЕДАЧИ 5 ||<----\ /---->|| 5
(CLEAR TO SEND) || \---\ /---/ ||
|| . ||
ИДЕТ ПЕРЕДАЧА ДАННЫХ 8 ||<---------/ \--------->|| 8
(DATA CARRIER DETECT) || ||
|| ||
ГОТОВНОСТЬ НАБОРА ДАННЫХ 6 ||<---------\ /--------->|| 6
(DATA SET READY) || . ||
ГОТОВНОСТЬ ТЕРМИНАЛА 20 ||----------/ \----------|| 20
(DATA TERMINAL READY) || ||
-!
цесс. Цель заключается в том, чтобы предоставить возможность обычным
пользователям запускать данный процесс, давая им временно права супер-
пользователя. (Не оставляйте исходный текст этой программы в системе,
поскольку кто-то может превратить ее в "лазейку" и перекомпилировать
ее - в главе 9 мы увидим такого рода дыры в системе защиты.)
Строка 14 запускает shell. Аргументом этого shell является строка
"ulimit sh". Эта строка будет выведена на экран, если мы выполним ко-
манду "ps -ef". Данный shell имеет новое значение ulimit.
Возможность изменить значение ulimit позволяет нам определить на-
ибольший возможный размер файла. Создание одного или нескольких таких
файлов максимального размера полезно в целях тестирования. Например,
полезно выяснить, сколько данных может содержать гибкий диск без пере-
полнения или что произойдет, когда система выйдет за пределы свободных
блоков. Мы хотим понять, как ведет себя система в таких ситуациях.
-------------------------------------------------------------
ИМЯ: umntsys
-------------------------------------------------------------
umntsys
Размонтирование всех файловых систем, смонтированных в данный мо-
мент.
umntsys
umntsys Размонтирует все смонтированные файловые системы
1 :
2 # @(#)umntsys v1.0 Unmount all file systems Author: Russ Sage
Размонтирование всех файловых систем
4 if [ "$#" -gt 0 ]
5 then echo "umntsys: too many arguments" >&2
6 echo "usage: umntsys" >&2
7 exit 1
8 fi
10 /etc/mount | sed -n -e '/^\/ /d' -e 's/^.* on \(.*\)
read.*/umount \1/p' | sh -
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ umntsys?
Иногда возникают ситуации, когда вы как администратор хотели бы
запустить систему в однопользовательском режиме. Например, вы хотите
сменить или установить жесткие диски и вам нужно, чтобы никто не имел
доступа к этому устройству, пока вы с ним работаете. Вам может также
понадобиться запустить систему в минимальной конфигурации с целью ло-
кализации какой-то проблемы. Поскольку выполнение операций завершения
работы системы и перезагрузки представляет собой довольно длительную
процедуру, было бы лучше иметь способ сохранить систему работающей, но
переключить в однопользовательский режим, а затем быстро перезапустить
многопользовательский режим, чтобы свести к минимуму неудобства поль-
зователей. Для того чтобы сделать это, нам нужно понять концепцию
"уровней работы системы" и использовать их.
Уровень работы (run level) в системе UNIX представляет собой
состояние или конфигурацию, в которой может быть машина. Фактически
это число, которое определяет, какие возможности системы включены или
отключены и находится ли система в одноили многопользовательском режи-
ме. Описание того, что происходит на каждом уровне работы системы, со-
держится в файле /etc/inittab. Обычно изменение уровня работы системы
включает в себя переход от многопользовательского режима (например,
уровень 6), к однопользовательскому режиму (уровень S).
Одним из побочных эффектов перехода от многопользовательского ре-
жима к однопользовательскому является то, что все дополнительные фай-
ловые системы размонтируются. Единственной смонтированной файловой
системой является корневая (определенная как /dev/root, /dev/hd0a и
т.п.). Ее никогда нельзя размонтировать. Когда происходит переход об-
ратно к многопользовательскому режиму, файловые системы обычно повтор-
но монтируются с помощью файла /etc/rc.
Мы можем эмулировать однопользовательский режим путем прекращения
выполнения всех процессов в системе командой kill и размонтирования
всех файловых систем. Командный файл umntsys предназначен для этой це-
ли.
ЧТО ДЕЛАЕТ umntsys?
Командный файл umntsys представляет собой набор конвейерных про-
цессов, которые в конечном итоге выполняют размонтирование всех смон-
тированных в данный момент файловых систем. Корневая файловая система
распознается как особая, поэтому не делается попытка размонтировать
ее. Также исключается попытка размонтировать немонтированные файловые
системы.
Первым делом командный файл umntsys проверяет отсутствие аргумен-
тов в командой строке. Поскольку для него не существует опций, команд-
ная строка должна быть пустой. Если количество аргументов больше нуля,
это ошибка, поэтому на стандартное устройство регистрации ошибок выво-
дится сообщение об ошибке, и программа завершается.
Вся работа выполняется в строке 10. Этот оператор похож на вол-
шебное заклинание. Начинается он с выполнения обычной команды mount
без аргументов. По умолчанию команда mount выводит таблицу с информа-
цией обо всех каталогах и именах устройств монтированных файловых
систем. Эта таблица выглядит примерно так:
-----------------------
|
| / on /dev/hd0a read/write on Mon Jan 06 09:53:03 1986
| /tmp on /dev/hd01 read/write on Mon Jan 06 09:53:03 1986
| /usr on /dev/hd02 read/write on Mon Jan 06 09:53:03 1986
| /u1 on /dev/hd03 read/write on Mon Jan 06 09:53:03 1986
| /u2 on /dev/hd04 read/write on Mon Jan 06 09:53:03 1986
| /u3 on /dev/hd05 read/write on Mon Jan 06 09:53:03 1986
| /mnt on /dev/fd01 read/write on Mon Jan 06 09:54:41 1986
|
Когда файловая система смонтирована, требуются и каталог, и имя
устройства. Когда файловая система не смонтирована, используется толь-
ко имя устройства. Нам нужно вырезать имена устройств из таблицы мон-
тирования и вставить их в команду umount. Это делается с помощью ко-
манды sed.
Команда sed начинает работать с опцией -n, которая подавляет вы-
полняемый по умолчанию вывод на экран, поэтому ничего не выводится,
пока мы не попросим. Мы можем использовать это в своих интересах, от-
фильтровывая ненужные нам строки. Первой коррекцией таблицы смонтиро-
ванных файловых систем является избавление от записи о корневой файло-
вой системе, поскольку мы бы не хотели пытаться ее размонтировать.
Поскольку корневой файловой системе соответствует каталог "/", мы мо-
жем использовать его в качестве ключа. Выражение в операторе sed озна-
чает: "Искать с начала строки первый символ наклонной черты (поскольку
этот символ имеет специальное значение, он экранирован обратной косой
чертой) и пробел за ним. Когда наклонная черта найдена, удалить ее".
Данный шаблон поиска соответствует только записи о корневой файловой
системе.
Следующая операция редактирования выполняется более замысловато.
Она использует возможность группирования регулярных выражений и после-
дующей ссылки на них по номеру, что вы уже видели в некоторых наших
предыдущих командных файлах. Данный синтаксис (регулярное выражение)
предназначен для группирования символов и последующей ссылки на них с
помощью номера \n. Фокус в том, чтобы выделить только имя устройства и
сгруппировать его, что и делает команда подстановки sed'а. Первое вы-
ражение означает: "От начала строки распознать любой символ, за кото-
рым следует любое количество любых символов, пробел и слово `on';
сгруппировать следующие символы вплоть до пробела, слово `read' и все
символы после него". В результате всего этого выделяется имя уст-
ройства и помещается во временную переменную, чтобы впоследствии к ней
можно было обратиться.
Вторая часть подстановки создает новую строку взамен исходной.
Эта строка состоит из слова "umount", пробела, затем группового выра-
жения номер 1, которое представляет собой временную переменную, содер-
жащую имя устройства. В результате всех этих действий таблица смонти-
рованных файловых систем (за исключением записи о корневой системе)
превращается в набор команд размонтирования с именами устройств в ка-
честве аргументов. Полученный результат имеет примерно такой вид:
-------------------
|
| umount /dev/hd0a
| umount /dev/hd01
| umount /dev/hd02
| umount /dev/hd03
| umount /dev/hd04
| umount /dev/hd05
| umount /dev/fd01
|
Теперь эти команды по конвейеру передаются другому shell ("sh
-"). Символ "-" указывает shell, что свои команды он должен получать
со стандартного ввода, а в данном случае это наши команды umount, пе-
реданные по конвейеру. Они размонтируют все файловые системы.
------------------------------------------------------------
ИМЯ: lrgf
------------------------------------------------------------
lrgf Создает файл максимально возможного размера
Выполняет операции записи в файл до тех пор, пока не обнаружится
граница размера файла.
lrgf
lrgf Определение границы размера файла
1 char id[] =
"@(#) lrgf v1.0 Create the largest file Author: Russ Sage
Создать файл максимального размера
3 #include
4 #include
5 #include
6 #include
8 #define FSIZ 512
9 #define BSIZ 1024
11 long ulimit();
12 char buf[BSIZ];
14 main()
15 {
16 register int n, fd, bcnt;
17 char file[FSIZ];
19 for (bcnt=0; bcnt
22 printf("\nMax file size: %ld bytes\n\n",
ulimit(UL_GFILLIM,0L)*512);
24 printf("filename to write to: ");
25 scanf("%s",file);
26 printf("\n");
28 if ((fd=open(file,O_RDRW|O_CREAT|O_TRUNC, 0644)) < 0)
29 {
30 perror("\nopen");
31 exit(1);
32 }
34 for (bcnt=0; ;bcnt++)
35 {
36 if ((n=write(fd, buf, BSIZ)) < 0)
37 {
38 perror("\nwrite");
39 break;
40 }
41 printf("block count: %d bytes written: %d\r",bcnt,n);
42 }
43 printf("\nend of program\n");
44 }
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖНА ПРОГРАММА lrgf?
Как обсуждалось ранее, нам необходимо знать, что происходит, ког-
да UNIX достигает каких-то пределов. Не только пределов размера файла,
а любых пределов. Примерами предельных значений являются количество
процессов, которые вы можете запустить, общее количество процессов в
системе, количество файлов, которые вам разрешено открыть, количество
свободных блоков, количество индексных дескрипторов, глубина вложен-
ности каталогов, при которой еще возможна работа, и т.д.
Нам нужна программа, создающая файл максимального размера. Затем
мы можем использовать этот файл для проверки различных пределов, имею-
щих отношение к файлам.
ЧТО ДЕЛАЕТ lrgf?
Lrgf - это программа, которая создает файл максимально возможного
размера. Выполняется это путем записи в файл до тех пор, пока команда
записи не окончится неудачей. Это означает, что в данный файл больше
нельзя записать данные, и он достиг границы.
При вызове программа lrgf выводит сообщение, содержащее общее ко-
личество байтов, которое вы можете записать в файл. Это значение вы-
числяется по значению ulimit, поэтому оно разное для разных пользова-
телей и зависит от shell, с которым пользователь сейчас работает.
Затем у вас запрашивается имя файла. Вы можете указывать любое
имя, для которого вы имеете права записи. Одним из способов проверки
жесткого диска является запись одного из таких больших файлов в каждый
раздел диска и затем проверка отдельных файловых систем. После запуска
программы вы увидите строку с сообщением, которое постоянно обновля-
ется. Оно содержит общее число записанных блоков и количество байтов,
которое записывалось при каждой попытке записи. Программа lrgf записы-
вает в файл каждый раз по 1024 байта. В зависимости от вашего значения
ulimit количество байтов, дописываемых в конец файла, может не быть
равным в точности 1 Кб. Выходное сообщение постоянно печатается в од-
ной и той же строке, заменяя на экране старое значение. Это достига-
ется путем вывода только символа возврата каретки, а не перевода стро-
ки.
Когда программа не может больше записывать данные в файл, итого-
вое количество блоков выводится на экран. Это общее число блоков, за-
писанных в файл.
1. $ lrgf
/dev/rfd0
Ввод имени устройства в ответ на запрос имени файла, в который
будет производиться запись. При этом программа lrgf выполняет последо-
вательную запись на гибкий диск неструктурированных данных. Тем самым
проверяется, распознает ли драйвер устройства переполнение гибкого
диска. Это важно знать при работе с командой cpio, которая предполага-
ет, что драйвер устройства сообщит об остановке и запросе следующей
дискеты.
2. $ lrgf
/usr/tmp/lrg
Создание файла в файловой системе /usr. Большинство систем XENIX
используют каталог /usr как отдельную файловую систему, отличную от
корневой. Созданием файла в каталоге /usr /tmp мы можем проверить по-
ложение дел в этой часто используемой файловой системе.
3. $ lrgf
/tmp/lrg
В данном случае создаваемый файл займет место в корневой файловой
системе (если вы не имеете каталога /tmp в вашей собственной файловой
системе). Потребуется не слишком много таких файлов для заполнения
всех свободных блоков в корневой файловой системе.
4. $ lrgf
/mnt/lrg
Создание файла на гибком диске в предположении, что на гибком
диске имеется файловая система и она смонтирована в каталог /mnt.
5. $ F=0
$ while :
> do
> echo -r "--> Making file $F <--"
> ./lrgf <<-!
> $F
> !
> echo
> F=`expr $F + 1`
> done
Данный цикл запускает программу lrgf бесконечное число раз. Счет-
чиком является переменная F. Она должна быть предварительно установле-
на в нуль, чтобы shell рассматривал ее как число, а не как символьную
строку. Сначала выводится сообщение, содержащее имя создаваемого фай-
ла. Первым именем файла является 0. Программа lrgf запускается,
используя в качестве входных данных "данный документ" (т.е. сам ко-
мандный файл). В качестве ответа на вопрос об имени файла используется
значение $F. Значение переменной F увеличивается, и программа lrgf вы-
зывается снова. Именами файлов являются 0, 1, 2 и т.д. Это продолжа-
ется до тех пор, пока не останется больше свободного места. Вряд ли вы
будете пользоваться этим часто, но для тестирования это прекрасное
средство заполнить все свободное пространство. Если вы хотите увидеть,
что делает ваша система, когда исчерпаны свободные блоки, примените
данный командный файл.
Строки 3-6 включают все необходимые файлы заголовков. Эти файлы
содержат определения и метки, необходимые данной программе.
Строки 8 и 9 определяют размеры буфера для имен файлов и буфера
для записи на диск. Значение BSIZ можно поднастроить, если программа
работает слишком медленно. У вас может возникнуть желание увеличить
BSIZ до 4096, чтобы производилось не так много операций записи.
Строка 11 определяет возвращаемое значение системного вызова
ulimit как длинное целое. Строка 12 резервирует буфер, который должен
быть записан. Этот буфер находится вне основной части программы из-за
ограничений на размер внутри функций. В основном блоке программы наи-
большая область автоматической памяти, которую вы можете иметь, равна
размеру вашего стека. Вы можете сделать по-другому, объявив данный бу-
фер как статическую переменную в функции main. Мы решили вынести его
за пределы функции main и не объявлять как статическую переменную.
Строка 16 объявляет некоторые рабочие переменные. Заметим, что
они помещаются в регистры. Это сделано для ускорения работы программы
и получения более компактного объектного кода.
Строка 17 резервирует буфер, в который вы вводите имя файла.
Строки 19 и 20 заполняют записываемый буфер символами "x", поэто-
му после создания файла мы можем их там увидеть.
Строка 22 выводит значение ulimit для вашего процесса. Обратите
внимание, что вызов ulimit возвращает количество блоков, поэтому мы
должны умножить это число на 512. В результате мы получим общее коли-
чество байтов, которое может содержать файл.
Строки 24-26 запрашивают имя файла, читают его и подготавливают
экран для следующего сообщения. Строки 28-32 открывают файл с указан-
ным именем для получения дескриптора файла. Файл открывается для за-
писи и чтения, создается при необходимости и обрезается, если он уже
существует. Если операция открытия файла заканчивается неудачей, выво-
дится сообщение об ошибке, и программа завершается.
Строки 34-42 выполняют запись. Цикл for бесконечен, поскольку в
середине оператора нет проверки значения счетчика. Переменная bcnt
постоянно увеличивается, пока выполняется запись.
Строка 36 выполняет запись в файл. Если запись неудачна, выво-
дится сообщение об ошибке и по оператору break осуществляется выход из
цикла. Строка 41 выводит количество выполненных операций записи и ко-
личество записанных байтов. Обратите внимание, что данный оператор
print содержит возврат каретки (\r), а не перевод строки. Это позволя-
ет курсору оставаться в одной итемах.
экране поверх старых значений. Экран не скроллируется, что удобно для
наблюдения. Выполнение цикла продолжается до тех пор, пока системный
вызов write не закончится неудачей и оператор break не прекратит цикл.
Когда это происходит, выполнение продолжается со строки 43, которая
печатает "end of program". Выполнение команды "ls -l" для записанного
файла показывает, сколько байтов имеет файл максимального размера. Это
количество должно совпадать с числом, которое сообщила вам программа
lrgf.
В данной главе представлена лишь небольшая часть возможных ислле-
дований внутренней работы файловых систем и устройств в UNIX. Некото-
рые из представленных программ могут быть неприменимы в вашей версии
системы UNIX или в вашей конфигурации аппаратных средств или могут
выглядеть в вашей системе иначе. Однако общие принципы сохраняются, и
вы можете использовать рассмотренные средства в качестве основы для
ваших собственных исследований.
ВВЕДЕНИЕ
ФИЗИЧЕСКОЕ ПОДКЛЮЧЕНИЕ
ПОДКЛЮЧЕНИЕ БЕЗ КОММУНИКАЦИОННЫХ УСТРОЙСТВ
ДОСТУП МИКРО-ЭВМ ИЛИ ТЕРМИНАЛА К СИСТЕМЕ UNIX
ПРЯМОЕ ПОДКЛЮЧЕНИЕ
ДИСТАНЦИОННОЕ ПОДКЛЮЧЕНИЕ
ДОСТУП ИЗ СИСТЕМЫ UNIX К МИКРО-ЭВМ
ОБНАРУЖЕНИЕ МОДЕМОВ В СИСТЕМЕ
ИСПОЛЬЗОВАНИЕ И КОНФИГУРИРОВАНИЕ ЛИНИИ
ИЗМЕНЕНИЕ СКОРОСТЕЙ ОБМЕНА
ЗАХВАТ ДАННЫХ
ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА ДЛЯ КОММУНИКАЦИОННЫХ ЛИНИЙ
cuchk - Cu check - проверка свободной линии для cu
talk - Обращение к последовательному порту
ДОСТУП ИЗ UNIX В UNIX
СВЯЗЫВАНИЕ UNIX-МАШИН
ОБЛАСТИ ДЛЯ ПЕРЕДАВАЕМЫХ ФАЙЛОВ
СЕТЕВАЯ БЕЗОПАСНОСТЬ
ОГРАНИЧИТЕЛЬНЫЕ ФАЙЛЫ
ОТЛАДКА КОММУНИКАЦИЙ
uust Состояние uucp и служебные действия
uutrans Передача файловых деревьев из одной системы
UNIX в другую систему UNIX
КОНФИГУРАЦИОННЫЕ РЕШЕНИЯ
ПОДКЛЮЧЕНИЕ UNIX К МОДЕМУ И ГЛАВНОЙ МАШИНЕ
ПОДКЛЮЧЕНИЕ UNIX И ТЕРМИНАЛА К МОДЕМУ
ПОДКЛЮЧЕНИЕ UNIX К ТЕРМИНАЛУ, МОДЕМУ И ГЛАВНОЙ МАШИНЕ
СИСТЕМА UNIX, МИКРО-ЭВМ И МОДЕМ
АЛЬТЕРНАТИВНОЕ РЕШЕНИ
ТРИ СИСТЕМЫ UNIX
В данной главе мы рассматриваем средства коммуникации в системе
UNIX. В то время как в мире MS-DOS коммуникации ограничены обычно
"черным ящиком" (программными пакетами и довольно стандартными
модемами), коммуникации в системе UNIX более сложны. UNIX предлагает
несколько уровней коммуникаций, включая передачу файлов, удаленную
регистрацию в системе, дистанционную почту и развитые системы обмена
сообщениями, которые могут связывать между собой сотни систем UNIX.
Однако, в большинстве систем UNIX нет удобно оформленных,
управляемых с помощью меню средств коммуникации. Вместо этого имеются
сложные системные команды и необходимость поддерживать много файлов.
Обычно требуется также владеть многими подробностями конфигурации и
использования модемов. Мы предлагаем теоретическое обоснование и
практические рекомендации, а также инструментальные средства, которые
помогут вам освоить данный аспект системы UNIX и обеспечить
работоспособность коммуникаций в вашей системе. Мы рассмотрим не
только прямую связь между машинами, но и связь с удаленными
терминалами и модемами.
Сначала мы займемся физическими соединениями, что является
первым этапом установки линии связи. Мы рассмотрим модель интерфейса
RS232-C и выясним, как подключить прямую межмашинную связь.
Затем мы обсудим обращение к системе UNIX с микро-ЭВМ. Поговорим
о том, какие существуют виды протоколов и какие из них лучше
использовать.
Далее мы рассмотрим, как пользоваться модемом, чтобы вызвать из
UNIX другие системы, например доски объявлений и системы, отличные от
UNIX. Вы можете изучить, как найти все модемные соединения в системе,
подключиться к последовательному порту и управлять модемом. При
обращении к другой системе вы можете перехватить все данные,
поступающие на ваш терминал, и сохранить их в файле для последующего
использования. Командные файлы (cuchk и talk), представленные в
данном разделе, следят за доступностью линии связи и устанавливают
связь с модемом.
В завершение мы рассмотрим связь между системами UNIX с помощью
утилиты uucp. Мы увидим, как и куда передавать файлы между системами,
как файлы защиты данных управляют средой uucp и изучим способы
отладки механизма передачи файлов с помощью uucp. Здесь представлены
командные файлы uust для выполнения рутинной работы по обслуживанию
uucp и uutrans для копирования древовидной структуры каталогов из
одной системы в другую.
Большинство машин, на которых работает UNIX, имеют один или
несколько последовательных портов. Эти порты - глаза и уши машин,
позволяющие системе связываться с внешним миром. Их можно
использовать для подключения любого устройства с интерфейсом RS-232-C
и для связи или управления. В данном разделе мы рассмотрим, как
подключить интерфейс RS -232-C для обеспечения связи типа UNIX-UNIX,
терминал-UNIX и модем-UNIX.
Начнем с рассмотрения базовой модели RS-232-C, показанной на
рис. 8-1. Эта модель иллюстрирует, как могут общаться друг с другом
две машины и/или терминалы либо через модемы по телефонным линиям,
либо по прямой (проводной) связи. Хотя последующее обсуждение мы
ведем преимущественно в терминах телефонных соединений, те же базовые
принципы относятся и к прямой связи, за исключением того, что
коммуникационные устройства (DCE, data communication equipment) в
этом случае не нужны.
Рис. 8-1. Стандартная модель интерфейса RS-232-C
-------------------------------------------------------------------
_||_
+-------+ 2 ***** _||_ ***** 2 +-------+
| |------>* *----\ || /----* *<------| |
| DTE-1 | * DCE * \ || / * DCE * | DTE-2 |
| |<------* * / || \ * *------>| |
+-------+ 3 * *<---/ || \--->* * 3 +-------+
***** || *****
-------------------------------------------------------------------
На каждом конце находятся терминальные устройства, называемые
DTE (data terminating equipment). В роли DTE может выступать
терминал, например, VT-100, или центральный процессор микро-, мини-
или большой ЭВМ.
Каждое терминальное устройство DTE должно использовать
коммуникационное устройство DCE, называемое обычно модемом, для
модуляции и демодуляции сигналов, проходящих по телефонным линиям.
Каждое DTE использует вывод номер 2 для передачи данных и вывод номер
3 для получения данных. Поскольку то, что передано с вывода 2 на
каждой машине, принимается на выводе 3 другой машины, возникает
перекрещивание телефонных линий между устройствами DCE.
Подсоединение и обработка сигнала между DTE и DCE полностью
соответствуют стандарту RS-232-C. Аппаратный протокол позволяет DTE
использовать DCE для посылки и приема данных от другого DTE.
Кабель, связывающий физически DTE и DCE, называется
"прямолинейным" кабелем. Он позволяет устройству DTE посылать команды
(или сигналы с выводов) на DCE, а устройству DCE отправлять команды
обратно на DTE. Подключение DCE одной машины к DCE другой машины
производится через обычные телефонные линии.
Устройства DCE необходимы по той причине, что устройства DTE
являются цифровыми, а телефонные линии - аналоговыми. Единственный
способ передать цифровую информацию по аналоговым линиям -
закодировать цифровую информацию в аналоговый сигнал, послать этот
сигнал по телефонным линиям, а затем декодировать аналоговый сигнал
обратно в цифровую информацию.
Если ваши машины расположены довольно близко (в пределах 50
футов / 15 метров. Один фут составляет около 30.5 см. - Примеч.
перев./), вам не нужен модем, вы можете использовать кабель "нулевого
модема" вместо DCE. Кабель нулевого модема имитирует такой же
протокол, что и DCE, но не требует наличия модема для коммуникаций.
Основная задача подключения нулевого модема - обеспечить
перекрещивание между передающими и принимающими сигналами. На рис. 8-
2 показана общая схема подключения без устройств DCE.
Рис. 8-2. Конфигурация с нулевым модемом
-------------------------------------------------------------------
+-------+ 2 2 +-------+
| |------>... ...<------| |
| DTE | 3 \./ 3 | DTE |
| |<------.../ \...------>| |
+-------+ +-------+
-------------------------------------------------------------------
Для того чтобы выполнить подключение, имитирующее DCE, требуются
некоторые манипуляции с сигналами. Эти манипуляции также
стандартизованы в кабеле нулевого модема. По схеме этого кабеля,
показанной на рис. 8-3, рассмотрим, как он имитирует сигналы DCE.
Рис. 8-3. Кабель нулевого модема RS-232-C
-------------------------------------------------------------------
DTE-1 DTE-2
|| ||
ЗАЩИТНАЯ ЗЕМЛЯ 1 ||-------------------------|| 1
(PROTECTIVE GROUND) || ||
|| ||
СИГНАЛЬНАЯ ЗЕМЛЯ 7 ||-------------------------|| 7
(SIGNAL GROUND) || ||
|| ||
ПЕРЕДАЧА ДАННЫХ 2 ||----------\ /----------|| 2
(TRANSMIT DATA) || . ||
ПРИЕМ ДАННЫХ 3 ||<---------/ \--------->|| 3
(RECEIVE DATA) || ||
|| ||
ЗАПРОС ПЕРЕДАЧИ 4 ||----- -----|| 4
(REQUEST TO SEND) || | | ||
|| | | ||
ГАШЕНИЕ ПЕРЕДАЧИ 5 ||<----\ /---->|| 5
(CLEAR TO SEND) || \---\ /---/ ||
|| . ||
ИДЕТ ПЕРЕДАЧА ДАННЫХ 8 ||<---------/ \--------->|| 8
(DATA CARRIER DETECT) || ||
|| ||
ГОТОВНОСТЬ НАБОРА ДАННЫХ 6 ||<---------\ /--------->|| 6
(DATA SET READY) || . ||
ГОТОВНОСТЬ ТЕРМИНАЛА 20 ||----------/ \----------|| 20
(DATA TERMINAL READY) || ||
-!