Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
int tcsendbreak(int fd, int duration)
Посылает поток нулей в fd
, чтобы узнать определенную длительность ( duration
), которая также известна как разрыв. Если duration
равняется 0, разрыв длится не менее 250 и не более 500 миллисекунд. К сожалению, POSIX не определяет элемент, длительность которого измеряется, поэтому единственной переносимой величиной для duration
является 0
. В Linux длительность увеличивает разрыв; 0
или 1
задают длительность между четвертью секунды и полсекунды; 2
— между полсекунды и секундой и так далее.
int tcdrain(int fd)
Ожидает, пока не передадутся все входные данные, ожидающие в данный момент на файловом дескрипторе fd
.
int tcflush(int fd, int queue_selector)
Отбрасывает некоторые данные в файловом дескрипторе fd
в зависимости от величины queue_selector
.
TCIFLUSH |
Сбрасывает на диск все полученные, но еще не прочитанные интерфейсом данные. |
TCOFLUSH |
Сбрасывает на диск все данные, записанные в интерфейс, но еще не отправленные. |
TCIOFLUSH |
Сбрасывает на диск все ожидающие входные и выходные данные. |
int tcflow(int fd, int action)
Приостановить или возобновить вывод или ввод в файловом дескрипторе fd
. Более точные действия определяются action
.
TCOOFF |
Приостановить вывод. |
TCOON |
Восстановить вывод. |
TCIOFF |
Передать символ STOP, запрашивающий прекращение передачи символов вторым концом соединения. |
TCION |
Передать символ START, запрашивающий восстановление передачи символов вторым концом соединения. |
Обратите внимание, что TCIOFF
и TCION
необязательны, и даже если второй конец соединения принимает их на обработку, перед этим может возникнуть задержка.
16.5.2. Размеры окна
Существуют два запроса ioctl()
, которые, к сожалению, не были закодированы как часть интерфейса termios
, хотя и должны были. Размер tty, измеряемый строками и столбцами, должен управляться tcgetwinsize()
и tcsetwinsize()
, но, поскольку они не существуют, вместо этого следует использовать ioctl()
. Для запроса текущего размера и установки нового размера применяйте структуру struct winsize
.
#include
struct winsize {
unsigned short ws_row; /* количество строк */
unsigned short ws_col; /* количество столбцов */
unsigned short ws_xpixel; /* не используется */
unsigned short ws_ypixel; /* не используется */
};
Для запроса текущего размера используйте следующий вызов:
struct winsize ws;
ioctl(fd, TIOCGWINSZ, &ws);
Для установки нового размера заполните struct winsize
и предусмотрите такой вызов:
ioctl(fd, TIOCSWINSZ, &ws);
В конце этой главы представлен пример условий, при которых возникает потребность в установке нового размера окна.
При изменении размеров окна лидеру группы процессов переднего плана на данном tty передается сигнал SIGWINCH
. Ваш код может перехватить этот сигнал; используйте TIOCGWINSZ
для запроса нового размера и внесите в свою программу все необходимые изменения.
16.5.3. Флаги
Четыре флаговых переменных — c_iflag
, с_oflag
, c_cflag
и c_lflag
— хранят флаги, управляющие определенными характеристиками. Заголовочный файл предоставляет символические константы битовых масок, которые, в свою очередь, предоставляют эти флаги. Устанавливайте их с помощью |=
и переустанавливайте с помощью &=
и как показано ниже.
t.c_iflag |= BRKINT;
t.c_iflag &= ~IGNBRK;
Некоторые из этих символических определений в действительности являются битовыми масками, охватывающими несколько взаимозависимых констант. Они используются с целью извлечения частей структуры для сравнения:
if ((t.c_cflag & CSIZE) == CS7) character_size = 7;
Набор флагов меняется от системы к системе. Наиболее важные флаги определены POSIX, но Linux, как и System V, включает несколько полезных флагов, не описанных в POSIX. Эта документация неполная; Linux поддерживает флаги, которые вряд ли понадобятся. Будут рассмотрены только те флаги, которые будут нужны наверняка.
Чтобы предоставить возможность создавать переносимое программное обеспечение, мы пометили каждый флаг, не определенный стандартом POSIX. Для таких флагов потребуется писать такой код:
#ifdef IUCLC
t.c_iflag |= IUCLC;
#endif
Также упоминаются области, представляющие особые проблемы переносимости, поэтому мы рассмотрим некоторые подробности функционирования других систем.
16.5.4. Флаги режима ввода
Флаги режима ввода влияют на обработку входных данных, хотя иногда они влияют и на выходные данные. Флаги, устанавливаемые в с_iflag
, описаны ниже.
BRKINT и IGNBRK |
При установке IGNBRK состояние разрыва игнорируется (см. описанную ранее tcsendbreak() ). Если IGNBRK не установлен, а BRKINT установлен, состояние разрыва заставляет tty сбросить все очередизованные входные и выходные данные и послать сигнал SIGINT процессам в группе процессов переднего плана для tty. Если IGNBRK и BRKINT не установлены, состояние разрыва читается как нулевой символ ( '\0' ), кроме случая установки PARMRK , в котором обнаруживается ошибка кадрирования и вместо этого в приложение передаются три байта '\377' '\0' '\0' . |
PARMRK и IGNPAR |
При установке IGNPAR полученные байты, содержащие ошибки четности или кадрирования, игнорируются (кроме того, что было ранее определено для состояния разрыва). Если IGNPAR не установлен, а PARMRK установлен, полученный байт с ошибкой четности или кадрирования передается приложению как трехбайтовая последовательность '\377' '\0' '\n' , где n — это байт в виде, в котором он был получен. В этом случае, если ISTRIP не установлен, допустимый символ '\377' передается приложению как последовательность двух символов '\377' '\377' ; при установке ISTRIP старший разряд символа '\377' разделяется и передается как '\177' . Если не установлены ни PARMRK , ни IGNPAR , полученный байт с ошибкой четности или кадрирования (отличной от состояния разрыва) передается приложению как отдельный символ '\0' . |
INPCK |
При установке INPCK включается проверка четности. Если она не включается, PARMRK и IGNPAR не влияют на полученные ошибки четности. |
ISTRIP |
При установке ISTRIP старший разряд отсекается из всех полученных байтов, ограничивая их семью битами. |
INLCR |
При установке INLCR полученные символы новой строки ('\n') преобразуются в символы возврата каретки ( '\r' ). |
IGNCR |
При установке IGNCR полученные символы возврата каретки ( '\r' ) игнорируются (не передаются приложению). |
ICRNL |
Если установлен ICRNL , а IGNCR не установлен, полученные символы возврата каретки ( '\r' ) сообщаются приложению как символы новой строки ( '\n' ). |
IUCLC |
При установке IUCLC и IEXTEN полученные символы верхнего регистра передаются приложению как символы нижнего регистра. Этот флаг в POSIX не определен. |
IXOFF |
При установке IXOFF tty может передать символы Control-S и Control-Q терминалу, чтобы заставить его, соответственно, остановиться и восстановить вывод (то есть передачу данных на компьютер) с целью переполнения входных буферов tty. Это имеет отношение только к последовательным терминалам, поскольку сетевые и локальные терминалы имеют более прямые формы управления потоком. Даже последовательные терминалы часто поддерживают аппаратное управление потоком, контролируемое управляющим флагом ( c_cflag ) и делающее неуместным программное управление потоком (Control-S и Control-Q). |
IXON |
При установке IXON принятый символ Control-S прекращает передачу входных данных в этот tty, а принятый символ Control-Q перезапускает передачу выходных данных в этот tty. Это соответствует любой форме терминального ввода-вывода, поскольку некоторые пользователи вводят буквенные символы Control-S и Control-Q для приостановки и восстановления вывода. |
IXANY |
При установке IXANY любой принятый символ (не просто Control-Q) перезапускает передачу выходных данных. Этот флаг в POSIX не определен. |
IMAXBEL |
При установке IMAXBEL предупреждающий символ ( '\а' ) передается тогда, когда символ принимается, а входной буфер уже полон. Этот флаг в POSIX не определен. |
16.5.5. Флаги режима вывода
Интервал:
Закладка: