Отладка кода tty далеко не всегда проста. Варианты пересекаются и влияют друг на друга разными способами, часто незапланированными. Но с помощью лишь отладчика невозможно увидеть то, что происходит, поскольку обработка, которой вы пытаетесь управлять, происходит в ядре.
Эффективным способом отладки кода, передающего информацию через последовательный порт, является использование программы-сценария. Во время разработки robin
мы соединили два компьютера последовательным кабелем и убедились, что соединение работает, запустив известную программу kermit
. В то время как программа kermit
уже работала на локальном компьютере, мы запустили программу-сценарий на удаленном компьютере, которая начала регистрировать все символы в файле. Затем мы вышли из kermit
и запустили сценарий на локальном компьютере, поместив полученный файл в текущий каталог на местном компьютере. Затем мы попытались запустить robin
по сценарию и сравнили два файла в начале и после каждого запуска, чтобы проследить разницу в символах. Таким образом мы разобрались с эффектами выбранных опций обработки.
Еще один метод отладки использует преимущества программы stty. Если во время проверки программы вы распознаете ошибку в настройках termios
, можете воспользоваться программой stty для немедленного внесения изменений вместо повторной компиляции своей программы. Если вы работаете на /dev/ttyS0
и хотите установить флаг ECHOCTL
, просто во время работы своей программы запустите следующую команду:
stty echoctl < /dev/ttyS0
Подобным же образом можно отображать текущее состояние используемого в данный момент порта:
stty -а < /dev/ttyS0
Как объяснялось ранее, трудно использовать один tty для запуска отладчика и программы искажения tty, которая отлаживается. Вместо этого следует присоединиться к процессу. Это не сложно. В одном сеансе X-терминала (делайте это под управлением X Window, чтобы одновременно видеть оба tty) запустите программу, которую собираетесь отладить. В случае надобности поместите ее в долгий режим ожидания в точке, где вы собираетесь присоединиться к процессу:
$ ./robin -b 38400 /dev/ttyS1
Теперь с помощью другого сеанса X-терминала найдите идентификатор процесса программы, которую вы пытаетесь отладить, одним из двух способов:
$ ps | grep robin
30483 ? S 0:00 ./robin - b 38400 /dev/ttyS1
30485 ? S 0:00 grep robin
$ pidof robin
30483
Более удобным является pidof
, но он может быть недоступен в системе. Запомните найденный номер (в данном случае 30483) и начните обычный сеанс отладки.
$ gdb robin 30483
GDB is free software...
...
Attaching to program '... /robin', process 30483
Reading symbols from...
0x40075d88 in sigsuspend()
Далее можно устанавливать точки прерывания и слежения, пошагово выполнять программу и так далее.
16.5. Справочник по termios
Интерфейс termios
состоит из структуры, набора функций, оперирующих с нею, и множества флагов, которые можно лично устанавливать.
#include
struct termios {
tcflag_t c_iflag; /* флаги режима ввода */
tcflag_t c_oflag; /* флаги режима вывода */
tcflag_t c_cflag; /* флаги управляющего режима */ tcflag_t c_lflag; /* флаги локального режима */
cc_t c_line; /* дисциплина линии связи */
cc_t c_cc[NCCS]; /* управляющие символы */
};
Элемент c_line
используется лишь в системных специфических приложениях [112] Например, приложения настройки сетевых протоколов, передающие информацию с помощью устройств tty.
, выходящих за рамки материала данной книги. Однако остальные пять элементов имеют отношение почти ко всем ситуациям, требующим манипулирования настройками терминала.
Интерфейс termios
определяет несколько функций. Все они объявлены в . Четыре из них являются обслуживающими функциями для переносимого манипулирования структурой struct termios
; остальные представляют собой системные вызовы. Функции, начинающиеся с cf
, являются обслуживающими, а функции, начинающиеся с tc
— системными вызовами управления терминалом. Все системные вызовы управления терминалом генерируют SIGTTOU
, если процесс в данный момент работает в фоне и пытается манипулировать своим управляющим терминалом (см. главу 15).
Кроме того, что уже было отмечено, эти функции возвращают 0
в случае успеха и -1
при ошибке. Вызовы функций, которые можно использовать для управления терминалом, описаны ниже.
Читать дальше