Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Два элемента в массиве с_сс
не являются управляющими символами и имеют отношение только к неформатируемому режиму: VTIME
и VMIN
. В этом режиме они определяют, когда возвращается read()
. В каноническом режиме read()
возвращается только в том случае, если строки были собраны или был достигнут конец файла, за исключением случая установки опции O_NONBLOCK
.
В неформатируемом режиме считывание по одному байту за раз неэффективно. Также неэффективно опрашивать порт чтением в неблокируемом режиме. Существуют два намного более эффективных дополнительных метода чтения.
Первый заключается в использовании poll()
, как описано в главе 13 и демонстрируется в коде robin.с
. Если poll()
сообщает, что файловый дескриптор готов к чтению, то известно, что вы можете немедленно прочитать некоторое количество байтов. Однако сочетание poll()
со вторым методом сделает ваш код более эффективным, предоставляя возможность считывать больше байтов за один раз.
"Управляющие символы" VTIME
и VMIN
состоят в сложных взаимоотношениях. VTIME
определяет промежуток времени для ожидания в десятых долях секунды (он не может быть больше cc_t
, обычно это 8-битный unsigned char
), который также может равняться нулю. VMIN
определяет минимальное количество байт для ожидания (не для считывания — третий аргумент read()
определяет максимальное количество байтов для считывания), которое тоже может равняться нулю.
• Если VTIME
равен нулю, VMIN
определяет количество байт для ожидания. Вызов read()
не возвращается, пока не будут считано VMIN
байт или пока не будет получен сигнал.
• Если VMIN
равен нулю, VTIME
определяет количество десятых частей секунд для ожидания read()
перед возвращением, даже если данные недоступны. В таком случае read()
, возвращающий нуль, необязательно сигнализирует о состоянии конца файла, как он обычно делает.
• Если ни VTIME
, ни VMIN
не равняются нулю, VTIME
определяет количество десятых долей секунды для ожидания read()
после того, как будет доступен хотя бы один байт. Если данные доступны при вызове read()
, таймер немедленно запускается. Если данные недоступны при вызове read()
, таймер запускается при принятии первого байта. Вызов read()
возвращается или тогда, когда были приняты хотя бы байты VMIN
, или по истечении таймера, независимо от того, что произойдет раньше. Он всегда возвращает хотя бы один байт, поскольку таймер не запускается, пока не будет доступен хотя бы один байт.
• Если и VTIME
, и VMIN
равны нулю, read()
всегда немедленно возвращается, даже если данные недоступны. И снова ноль необязательно указывает на состояние конца файла.
16.6. Псевдотерминалы
Псевдотерминалы, или pty — это механизм, позволяющий программе на уровне пользователя заменять место (логически говоря) драйвера tty для элемента оборудования. pty имеет два отдельных конца: конец, эмулирующий оборудование, называется в едущим устройством pty, а конец, обеспечивающий программы обычным интерфейсом tty, называется подчиненным компонентом pty. Подчиненный компонент выглядит как обычный tty; ведущее устройство выглядит как стандартное устройство символьного ввода-вывода и не является tty.
Драйвер последовательного порта обычно реализуется как часть кода ядра, управляемая прерываниями. Однако так бывает не всегда. Например, существует хотя бы один терминальный сервер, основанный на SCSI, который использует обобщенный интерфейс SCSI для организации программы на уровне пользователя, сообщающейся с терминальным сервером и предоставляющей доступ к последовательным портам через pty.
Сеансы работы с сетевыми терминалами происходят подобным образом; программы rlogind
и telnetd
подключают сетевой сокет к ведущему устройству pty и запускают оболочку в подчиненном компоненте pty, чтобы заставить сетевые подключения действовать как tty, позволяя запускать интерактивные программы в сетевом подключении, не имеющем ничего общего с tty. Экранная программа мультиплексирует несколько соединений pty на один tty, который может или не может быть pty, соединенным с пользователем. Ожидаемая программа позволяет программам, настаивающим на запуске в интерактивном режиме в tty, быть запущенными в подчиненном компоненте pty под управлением другой программы, соединенной с ведущим устройством pty.
16.6.1. Открытие псевдотерминалов
Существует широкое разнообразие способов открытия псевдотерминалов. Обычно это делается (по крайней мере, в Linux) способом, более или менее соответствующим стандартам, основанным на SysV, а также устаревшим способом, основанным на практике BSD. Наиболее распространенным методом среди системных программистов в Linux является набор расширений BSD, реализованных также как часть glibc. Менее распространенный метод документируется как часть стандарта 1998 года — Unix98, и документируется иначе в версии 2000 года стандарт Unix98.
Исторически существует два различных метода открытия псевдотерминалов в Unix и подобных системах. Linux изначально придерживался модели BSD, хотя она более сложная в использовании, поскольку модель SysV явно написана в рамках STREAMS, а в Linux STREAMS не реализована. Однако модель BSD требует, чтобы каждое приложение искало неиспользуемое ведущее устройство pty, зная о многих специфических именах устройств. Между 64 и 256 устройства pty обычно доступны, а с целью поиска первого открытого устройства программы проводят поиск в устройствах, начиная с наименьшего числа. Они выполняют поиск в специфической манере, которая демонстрируется в программе ptypair
, включенной в данный раздел.
С моделью BSD связано несколько проблем.
• Каждое приложение должно знать весь набор доступных имен. При расширении набора возможных псевдотерминалов каждое приложение, использующее псевдотерминал, должно быть модифицировано с явным знанием всех возможных имен устройств, что вызывает неудобства и подвержено ошибкам.
• Время, уходящее на поиск, становится ощутимым при поиске среди тысяч узлов устройств в каталоге /dev
. Системное время тратится, и доступ к системе замедляется, что очень плохо масштабируется в больших системах.
• Обработка полномочий может оказаться проблематичной. Например, если программа выполняет аварийное завершение, она может оставить файлы устройств псевдотерминалов с несоответствующими полномочиями.
Поскольку модель SysV явно написана в рамках STREAMS и требует использования вызовов ioctl() для запуска подчиненных компонентов, она не является вариантом выбора Linux. Однако интерфейс Unix98 не определяет функции
, присущие STREAMS, поэтому в 1998 году в Linux была добавлена поддержка псевдотерминалов стиля Unix98.
Интервал:
Закладка: