Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Теперь с помощью другого сеанса 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.
, выходящих за рамки материала данной книги. Однако остальные пять элементов имеют отношение почти ко всем ситуациям, требующим манипулирования настройками терминала.
16.5.1. Функции
Интерфейс termios
определяет несколько функций. Все они объявлены в . Четыре из них являются обслуживающими функциями для переносимого манипулирования структурой 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 |
Изменение вступает в силу после того, как выходная очередь была очищена; входная же очередь отбрасывается перед вступлением изменений в силу. |
Если система не может обработать некоторые настройки, например, скорость передачи данных, ей разрешается игнорироватьих без выдачи сообщения об ошибке. Единственный способ, с помощью которого можно узнать, были ли приняты настройки — вызвать tcgetattr()
и сравнить содержимое возвращаемой им структуры с содержимым структуры, переданной tcsetattr()
.
Поэтому более переносимые приложения используют код вроде показанного ниже.
#include
struct termios save;
struct termios set;
struct termios new;
int fd;
...
tcgetattr(fd, &save);
set = save;
cfsetospeed(&set, B2400);
cfsetispeed(&set, B2400);
tcsetattr(fd, &set);
tcgetattr(fd, &new);
if ((cfgetospeed(&set) != B2400) ||
(cfgetispeed(&set) != B2400)) {
/* объяснение */
}
Обратите внимание, что если не имеет значения, "зависнет" ли настройка termios
, лучше проигнорировать это условие, как делается в robin
.
speed_t cfgetospeed(struct termios * t);
speed_t cfgetispeed(struct termios * t);
Извлекает скорость, соответственно, вывода или ввода из t
. Эти функции возвращают символическую скорость, такую же, которая дается cfsetospeed()
и cfsetispeed()
.
int cfsetospeed(struct termios * t, speed_t speed);
int cfsetispeed(struct termios * t, speed_t speed);
Устанавливает, соответственно, вывода или ввода в t
на speed
. Обратите внимание, что эта функция не меняет скорость соединения на любом файловом дескрипторе; она просто устанавливает скорость в структуре termios
. Скорость, как и другие характеристики, применяется к файловому дескриптору с помощью tcsetattr()
.
Эти функции принимают символическую скорость — то есть число, соответствующее определению одного из следующих макросов, имена которых определяют скорость в битах в секунду: B0
(0 бит в секунду, определяет отключенное состояние) B50
, B75
, B110
, B134
[113] B134 в действительности равняется 134,5 бит/с, скорость, используемая устаревшим терминалом IBM.
, B150
, B200
, B300
, B600
, B1200
, B1800
, B2400
, B4800
, B9600
, B19200
, B38400
, B57600
, B115200
, B230400
, B460800
, B500000
, B576000
, B921600
, B1000000
, B1152000
, B1500000
, B2000000
, B2500000
, B3000000
, B3500000
или B4000000
. B57600
и выше в POSIX не описаны; переносимые исходные коды использует их только в том случае, если они защищены операторами #ifdef
.
По мере того, как будут разрабатываться драйверы Linux для оборудования, поддерживающего другие скорости передачи данных, в заголовочный файл будут добавляться новые символические скорости.
В настоящий момент скорость ввода игнорируется. Интерфейс termios устанавливает отдельные скорости ввода и вывода для асинхронного оборудования, допускающего раздельные скорости, но такое оборудование встречается довольно редко. Просто вызовите cfsetospeed()
и cfsetispeed()
попарно, чтобы ваш код продолжил работать в системах, поддерживающих раздельные скорости.
Не все tty поддерживают все скорости — последовательные порты на стандартных ПК не поддерживают более 115 200 бит/с. Как уже упоминалось выше, если для вас имеет значение, вступит ли в силу определенная настройка, необходимо использовать tcgetattr()
для проверки после того, как вы попытаетесь установить ее с помощью tcsetattr()
. Также обратите внимание, что установленная вами скорость является необязательной. Некоторые tty, например, локальные консоли, благополучно принимают и игнорируют любую установленную вами скорость.
Интервал:
Закладка: