+++ # если вы этого не хотите, временно
# выйти из модемного подключения
# (по команде escape, а не exit)
OK # Ответ модема на временный выход
ATh0 # Попросить модем занять телефон
OK # Ответ модема
~. # Завершить работу с cu
Для того чтобы указать программе cu автоматический набор номера,
используйте другой синтаксис в командной строке. Мы применяем
устройство автоматического вызова ACU для того, чтобы сделать вызов.
Фактическая команда набора номера генерируется программой
/usr/lib/uucp/dial. Пример вызова выглядит так:
$ cu -acua0 555-1212
ИЗМЕНЕНИЕ СКОРОСТЕЙ ОБМЕНА
Модемы типа Smartmodem могут работать со скоростями 300 и 1200
бод. По умолчанию, программа cu подключается к последовательному
порту на скорости 1200 бод. Если вы подключаетесь с использованием
умолчаний, проверьте скорость, временно выйдя из программы cu (по
команде escape, а не exit), и применив команду stty, которая
отображает скорость обмена:
~!stty < /dev/tty00
Эта команда должна сообщить обычные установки stty для
последовательного порта /dev/tty00. Скорость обмена должна равняться
1200. Модемы типа Smartmodem автоматически понижают скорость до 300
бод при ответе по телефону. При вызове вы можете понизить скорость
модема до 300 бод двумя различными способами.
Первый способ - заставить cu открыть линию со скоростью 300 бод,
указав 300 в командной строке программы cu. Заметим, что когда вы
применяете альтернативную скорость (отличную от 1200 бод), запись о
скорости обмена ДОЛЖНА присутствовать в файле L-devices И в командной
строке cu, как в следующем примере:
$ cu -ltty00 -s300 dir
Второй метод хитрее, но зато предоставляет больше гибкости. Мы
можем вызвать cu со значением по умолчанию 1200, затем временно (по
команде escape) выйти из cu и вызвать программу stty, чтобы указать
скорость обмена последовательного порта равной 300 бодам. Это нужно
сделать после того, как вы обратились к линии с помощью cu. Эта
измененная скорость обмена действительна до тех пор, пока вы не
закроете линию (т.е. окончательно выйдете из cu по команде exit). В
этот момент порт инициализируется заново. Например:
$ cu -ltty00 dir # Захватить линию на 1200 бод
Connected # Отзыв программы cu
~!stty 300 < /dev/tty00 # Временно выйти из cu и
# установить для линии tty
# скорость 300 бод
Отметим, что этот метод НЕ требует наличия записи о скорости 300
бод в файле L-devices, поскольку мы работаем с последовательным
портом вне области действия программы cu.
Попутно заметим, что временный выход (по команде escape) из cu
совершенно аналогичен временному выходу из любой команды системы
UNIX. Вы можете временно выйти для запуска определенной команды,
например:
~!echo "you can run any command here"
Вы можете также перейти в shell и работать так, как вы всегда
работаете:
~!sh
Вы должны, однако, помнить, что вы все еще подключены с помощью
программы cu к последовательному порту, а телефон по-прежнему
подсоединен к удаленной системе до тех пор, пока вы не дадите вручную
команду выхода или отключения телефона, или пока удаленная система не
отключит телефон по тайм-ауту.
ЗАХВАТ ДАННЫХ
Теперь мы умеем найти модем, подключиться к последовательной
линии и установить связь с другой системой. Если мы вызываем доску
объявлений, нам может понадобиться захватывать файлы с целью
последующего использования. Программа cu не предоставляет такой
возможности. Как мы уже отмечали, микро-ЭВМ делают это обычно при
помощи RAM-буфера, который сохраняется на диске, когда он
заполняется. А UNIX не может действовать таким образом.
Простейший способ, придуманный мною для захвата данных из другой
системы - пропустить по конвейеру все, что выдается на терминал,
через команду tee системы UNIX. Весь ввод с вашей клавиатуры не
перехватывается, а все, что идет на стандартное устройство вывода
(stdout) попадает в выходной файл утилиты tee. Это выглядит так:
cu -ltty00 dir | tee файл_перехвата
Одно из последствий перехвата информации таким методом состоит в
том, что все символы возврата каретки, печатаемые из удаленной
системы, попадают в выводной файл команды tee. Вы обнаруживаете их в
виде "^M" в конце каждой строки файла. Избавиться от всех этих
возвратов каретки легко, попробуйте выполнить такую
последовательность команд редактора ed:
ed файл_перехвата
1,$s/^M//g
w
q
Смысл этих команд следующий. Для каждой строки во всем файле (1,
$) заменить возврат каретки (^M) на ничего (//). Сделать это для
произвольного количества символов возврата каретки в отдельной строке
("g" означает глобальную замену в строке). Вы можете превратить
control-M в заменяемую строку либо вводом символа обратной косой
черты (\) и настоящим нажатием на клавишу возврата каретки, либо в
редакторе vi использовать префикс control-V для разрешения ввода
управляющих символов. После редактирования запишите файл и выйдите из
редактора ed.
Конечно, все это вы можете для удобства оформить в виде
командного файла интерпретатора shell.
ИНСТРУМЕНТАЛЬНЫЕ СРЕДСТВА ДЛЯ КОММУНИКАЦИОННЫХ ЛИНИЙ
Две утилиты, которые мы здесь предлагаем, связаны с доступом к
последовательному порту. Когда линия освобождается, вы сразу же
узнаете об этом и можете управлять линией с помощью нескольких
нажатий клавиш.
---------------------------------------------------------------------------
ИМЯ: cuchk
---------------------------------------------------------------------------
cuchk Cu check - проверка свободной линии для cu
НАЗНАЧЕНИЕ
Опрашивает таблицу состояния процессов и ищет процессы cu. Когда
они завершаются, на ваш экран выдается сообщение и программа
прекращает работу.
ФОРМАТ ВЫЗОВА
cuchk - Сообщить, когда cu освободит линию
ПРИМЕР ВЫЗОВА
cuchk
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) cuchk v1.0 Check for a free cu line Author: Russ Sage
Проверка свободной линии для cu
4 if [ "$#" -gt "0" ]
5 then echo "cuchk: too many arguments" >&2
6 echo "usage: cuchk" >&2
7 exit 1
8 fi
10 while :
11 do
12 ps -e | fgrep cu > /dev/null \
13 && sleep 5
14 || { echo "\ncu is free"; exit; }
15 done &
ОПИСАНИЕ
ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ cuchk?
Похоже, что большинство систем UNIX скупы на последовательные
порты. Это становится важным моментом, когда имеется только один
выводной порт для шести или семи человек. Опыт показывает, что если
вы не получите доступ к порту сразу, то вам прийдется ждать снова и
снова и вы не будете знать, как долго собирается текущий пользователь
занимать определенный порт. Вместо того чтобы терять время на
постоянную проверку занятости порта, почему бы не поручить машине
сообщить вам, когда этот порт освободится?
ЧТО ДЕЛАЕТ cuchk?
При вызове программы cuchk она запускается в фоновом режиме. Она
управляется бесконечным циклом, обеспечивающим ее работоспособность.
Программа cuchk наблюдает за системой, ведя поиск среди всех активных
процессов. Если она обнаруживает процесс cu (который может работать с
интересующим нас портом, а может и нет), она засыпает на 5 секунд и
снова ведет поиск. Если нет процессов cu, функционирующих на машине,
она выдает сообщение "cu is free" ("cu свободна") и завершается.
Таким образом, мы не обязаны вручную следить за работой cuchk, она
сама запускается и сама завершается. Это имеет смысл, поскольку вся
ценность этой утилиты свелась бы на нет, если бы ее саму нужно было
периодически проверять!
ПОЯСНЕНИЯ
В строках 4-8 выполняется проверка на ошибки. Поскольку cuchk не
имеет никаких опций, в командной строке не должно быть никаких
параметров. Если параметры присутствуют, это считается ошибкой.
Строки 10-15 организуют вечный цикл while. Обратите внимание,
что амперсанд в строке 15 автоматически запускает cuchk в фоновом
режиме, ведь нет никакого резона выполнять эту программу в
приоритетном режиме.
В строке 12 выполняется команда "ps -e", которая выдает
информацию о состоянии всех значительных пользовательских процессов.
Эти данные пропускаются по конвейеру через fgrep. Утилита fgrep ищет
наличие символов "cu". Мы надеемся, что эти символы соответствуют
только процессам cu, которые мы ищем. Они могут, однако, относиться к
чему-то совершенно неожиданному, например "picuser" или к какому-то
аналогично построенному имени. Результат работы команды fgrep
направляется на устройство /dev/null, чтобы избавиться от лишней
информации. Нас интересует только статус завершения команды fgrep. Он
сообщает нам, найдено ли вхождение символов "cu" или нет.
В конце строки 12 присутствует символ обратной косой черты,
указывающий интерпретатору shell, что следующая физическая строчка
является на самом деле частью той же самой программной строки и что
нужно добавить ее к строке 12, а не выполнять самостоятельно.
Разбиение длинных строк на несколько меньших строк с помощью символов
обратной косой черты позволяет нам получать красиво оформленный,
более наглядный исходный код.
Строка 13 выполняется в том случае, если fgrep отработала
успешно (т.е. если она выдает нулевой статус завершения). Это
означает, что символы "cu" найдены, а значит процесс cu работает и в
настоящее время не доступен. Поэтому процесс cuchk засыпает на 5
секунд. Когда он пробуждается, выполнение продолжается со строки 10,
возобновляется вечный цикл и проверка процессов продолжается.
Если fgrep не находит символы "cu" (возвращается ненулевой
статус завершения), то выполняется строка 14, которая выдает
сообщение о том, что программа cu свободна, и работа программы
завершается. Таким образом, мы сразу же знаем, что линия cu открыта
для использования, поэтому мы можем поскорее занять ее.
---------------------------------------------------------------------------
ИМЯ: talk
---------------------------------------------------------------------------
talk Обращение к последовательному порту
НАЗНАЧЕНИЕ
Выполняет командную строку, подготавливающую последовательный
порт для общения с другой системой.
ФОРМАТ ВЫЗОВА
talk [-bBAUD] [-l] [-tTTY] [-u]
Опции:
-b установить новую скорость обмена
-l протоколировать все поступающие данные
-t использовать другой порт tty
-u использовать принятую в UNIX скорость обмена 9600
ПРИМЕР ВЫЗОВА
talk -b300 -t01 -l
Обратиться к последовательному порту tty01 на скорости 300 бод и
протоколировать выводные данные в текстовый файл.
ТЕКСТ ПРОГРАММЫ
1 :
2 # @(#) talk v1.0 Talk to the serial port Author: Russ Sage
Обращение к последовательному порту
4 BAUD="1200"
5 TTY="tty11"
6 PIPE=""
8 for ARG in $@
9 do
10 case $ARG in
11 -b*) BAUD="`echo $ARG|cut -c3-`";;
12 -l) echo "logging in /tmp/talk.$$"
13 PIPE="| tee /tmp/talk.$$";;
14 -t*) TTY="tty`echo $ARG|cut -c3-`";;
15 -u) BAUD="9600";;
16 *) echo "talk: invalid argument $ARG" >&2
17 echo "usage: talk [-bBAUD] [-l] [-tTTY] [-u]" >&2
18 echo " -b baud rate" >&2