D3 Reference Manual

Index | Help

Поиск по страницам

Разделы / Общие сведения / hangup

hangup

Обработка состояния зависания

Означает состояние, когда устройство, обычно модем или сетевой адаптер, сообщает приложению, что связь невозможна.

Обзор

Пользовательский терминал может быть подсоединен к другому устройству двумя путями:

  • напрямую
  • через модем

В первом случае, соединение всегда установлено. Во втором случае, соединение может быть разорвано по причине сбоя модема, из-за невозможности установить связь с удаленным модемом. Приложение должно быть извещено об этом инциденте.

Эмуляция терминала в локальной или глобальной сети является расширением модемного соединения. Сеть может повесить (закрыть) открытое соединение. Это событие представляется приложению как hangup, или потеря несущей (DCD loss).

Обработчик сигналов зависаний

Приложение отслеживает состояние системы на предмет зависаний посредством TCL-команды dcd: если dcd-протокол отключен (dcd-off), приложение не извещается о зависании; если протокол включен (dcd-on), по умолчанию процесс выводится из системы (logoff). В среде Unix существует возможность запустить специальную FlashBASIC программу или макрос, которые будут обрабатывать данное событие. Такая программа, называемая обработчик сигналов, задается командой TCL trap.

При зависании модема, весь терминальный вывод теряется, а ввод находится в ожидании возобновления соединения, если это возможно (см. ограничения ниже, в зависимости от типа устройства).

Макрос или FlashBASIC программа, назначенная на обработку потери несущей, задается с учетом типа используемого устройства.

Обработчик зависаний на последовательном устройстве

На последовательном устройстве, обработчик зависаний может быть следующим:

  • "OFF" - процесс отключается от системы и находится на приглашении зарегистрироваться до восстановления несущей.
  • "EXIT" - процесс отключается от системы и виртуальной машины D3. Если порт помечен как respawn, Unix будет ждать восстановления несущей перед созданием нового процесса D3. Если процесс D3 запущен вручную (из оболочки), Unix стартует оболочку заново после восстановления несущей.
  • Другие. Пользовательские обработчики могут выполнять INPUT, который ждет восстановления несущей, или просто создает паузу, в этом случае какая бы команда ни была запущена во время потери несущей, она продолжает выполняться (при этом терминальный вывод теряется) до запроса на ввод (на уровне TCL или FlashBASIC). В этом случае процесс находится в процессе ожидания, оставаясь в системе, до восстановления несущей. См. ниже пример приложения, реализующего рассматриваемую возможность.
Обработчик зависаний в сети

Когда процесс выполняется на псевдо-терминале, например, созданном одним из клонированных драйверов (rlogin, telnet и т.д.), сигнал зависания обычно означает не только разрыв соединения, но и крушение псевдо-терминала tty (клона), и, возможно, выделение его под другую сессию. Поэтому невозможно поддерживать выполнение процесса на одном псевдо-терминале.

В этом случае обработчик ограничен только следующими командами:

  • "EXIT" - процесс выводится из системы и отключается от виртуальной машины D3. Материнский процесс оболочки, если он был, как правило, уже уничтожен.
  • Другие. Пользовательский обработчик должен заканчиваться выполнением команды TCL exit или disc (например, chain 'exit'). Не должно быть никакого ввода, иначе будет генерироваться ошибка чтения.

Примеры:

Пример использования обработчика зависаний:

Первая глобальная переменная служит для индикации события зависания, для того чтобы приложение могло выполнить выход из меню и прервать выполнение команды в случае зависания. Вторая глобальная переменная 'display.menu' используется для предупреждения обработчика, что во время зависания в меню сидел пользователь, и требуется обновить экран перед остановом.

* Глобальные переменные
common /SYSTEM/hangup,display.menu
* Говорим, что мы на связи
hangup=0
loop

* Говорим, что мы хотим обновит меню
display.menu=1
* Выводим меню
call set.menu
* Запрашиваем команду
input command
* Говорим, что мы закончили с меню
display.menu=0
* Выполняем команду
begin case
...
end case
* Проверям, не было ли зависания
if hangup then
* Обработка зависания
...
* Конец обработки
hangup=0
end
repeat

Обработчик сигналов :

Обработчик сигналов задает глобальную переменную 'hangup' и ждет восстановления несущей. Если пользователь был в меню, обработчик выводит его на экран заново после восстановления соединения

* Глобальные переменные
common /SYSTEM/hangup,display.menu
* Говорим, что мы зависли
hangup=1
* Игнорируем другие сигналы о зависании
execute "dcd-off"
* Выполняем некоторые специфичные операции
* (завершение выполнения текущей команды, и т.д.)
...
* Если в сети, необходимо выполнить выход
* chain "exit" ;* Network only
* Ждем восстановления соединения
* Оператор ввода INPUT с задержкой 0 гарантирует
* что ввод будет возобновлен, как только
* соединение будет восстановлено, без
* необходимости вводить что-либо со стороны пользователя
input dummy for 0 then null
* Соединение восстановлено - смотрим, надо ли
* снова вывести меню
if display.menu then
* Мы можем снова вывести меню
call set.menu
display.menu=0
end
* Конец зависания
* Мы должны перехватить вывод на экран,
* чтобы он не помешал
execute "dcd-on" capturing dummy
* Обработчик останавливается
* Приложение продолжает работу
stop