Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Если какой-то из входных файловых дескрипторов вернет признак конца файла,

robin
выходит из цикла
poll
и передает управление обработке завершения, что соответствует обработчику сигнала: восстановление старых настроек
termios
на обоих входных файловых дескрипторов и завершение. В неформатируемом режиме существует только два способа завершения
robin
: закрыть один из файловых дескрипторов или передать ей сигнал.

16.4. Отладка

termios

Отладка кода 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 <termios.h>

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] , выходящих за рамки материала данной книги. Однако остальные пять элементов имеют отношение почти ко всем ситуациям, требующим манипулирования настройками терминала.

112

Например, приложения настройки сетевых протоколов, передающие информацию с помощью устройств tty.

16.5.1. Функции

Интерфейс

termios
определяет несколько функций. Все они объявлены в
<termios.h>
. Четыре из них являются обслуживающими функциями для переносимого манипулирования структурой
struct termios
; остальные представляют собой системные вызовы. Функции, начинающиеся с
cf
, являются обслуживающими, а функции, начинающиеся с
tc
— системными вызовами управления терминалом. Все системные вызовы управления терминалом генерируют
SIGTTOU
, если процесс в данный момент работает в фоне и пытается манипулировать своим управляющим терминалом (см. главу 15).

Кроме того, что уже было отмечено, эти функции возвращают

0
в случае успеха и
– 1
при ошибке. Вызовы функций, которые можно использовать для управления терминалом, описаны ниже.

int tcgetattr(int fd, struct termios * t);

Восстанавливает текущие настройки файлового дескриптора

fd
и помещает их в структуру, на которую указывает t.

int tcsetattr(int fd, int options, struct termios * t);

Устанавливает текущие настройки терминала для файлового дескриптора

fd
в настройки, приведенные в
t
. Всегда используйте
tcgetattr
для заполнения
t
, затем модифицируйте его. Никогда не заполняйте
t
вручную: некоторые системы требуют установки или снятия флагов, кроме флагов, определенных POSIX, поэтому заполнение вручную является непереносимым.

Аргумент

options
определяет, когда изменения вступают в силу.

TCSANOW
Изменение немедленно вступает в силу.
TCSADRAIN
Изменение вступает в силу после того, как передаются все входные данные, уже записанные в
fd
; перед вступлением в силу оно очищает очередь. Необходимо использовать это при смене выходных параметров.
TCSAFLUSH
Изменение вступает в силу после того, как выходная очередь была очищена; входная же очередь отбрасывается перед вступлением изменений в силу.
Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2