Читаем Linux API. Исчерпывающее руководство полностью

Мы опускаем множество подробностей, касающихся SSH-клиента и сервера. Например, эти программы шифруют данные, передающиеся по сети в любом направлении. В нашем примере SSH-сервер на удаленном компьютере состоит лишь из одного процесса, но на самом деле работает в параллельном режиме. Он становится демоном и создает пассивный TCP-сокет, который ждет входящих соединений со стороны SSH-клиентов. Для каждого соединения главный SSH-сервер создает отдельный дочерний процесс, полностью отвечающий за обслуживание конкретной клиентской сессии (именно этот дочерний процесс изображен на рис. 60.3). Помимо настройки псевдотерминала, описанной выше, дочерний процесс SSH-сервера занимается аутентификацией пользователя, обновлением учетных файлов на удаленном компьютере (как описано в главе 40) и впоследствии запуском командной оболочки.



Рис. 60.3.Как ssh использует псевдотерминал


В некоторых ситуациях ко вторичному концу псевдотерминала можно подключать несколько процессов. Такой сценарий проиллюстрирован в нашем примере с ssh. Лидером сессии для вторичного устройства является командная оболочка, создающая группы процессов для выполнения команд, вводимых удаленным пользователем. Для всех этих процессов вторичный конец играет роль управляющего терминала. Как и при работе в обычном терминале, одна из указанных групп может быть активной по отношению ко вторичному концу псевдотерминала, и только ей будет позволено считывать и записывать (если был установлен бит TOSTOP) данные в это устройство.


Приложения, использующие псевдотерминалы

Псевдотерминалы применяются не только в сетевых службах, но и во многих других приложениях, среди которых можно выделить следующие.

• Приложение expect(1) задействует псевдотерминал, чтобы позволить управлять программой, ориентированной на работу с терминалом, с помощью сценариев.

• Эмуляторы терминалов, такие как xterm, используют псевдотерминалы для предоставления терминальных функций в оконном режиме.

• Приложение screen(1) применяет псевдотерминалы для мультиплексирования одного физического терминала (или терминального окна) между несколькими процессами (например, между сессиями командной строки).

• Псевдотерминалы используются в программе script(1), которая записывает весь ввод и вывод, возникающий во время сессии командной строки.

• Иногда псевдотерминал может помочь обойти стандартную блочную буферизацию, выполняемую стандартными функциями ввода/вывода при записи данных на диск или в именованный канал вместо линейной буферизации, применяемой для терминального вывода (мы вернемся к этому вопросу в упражнении 60.7).


60.2. Псевдотерминалы стандарта UNIX 98


В данном разделе мы шаг за шагом напишем функцию ptyFork(), выполняющую большую часть работы, проиллюстрированной на рис. 60.2. Затем реализуем на ее основе программу script(1). Но сначала рассмотрим различные библиотечные функции, применяемые в сочетании с псевдотерминалами стандарта UNIX 98.

• posix_openpt() открывает свободное первичное устройство псевдотерминала и возвращает файловый дескриптор, который будет использоваться для работы с этим устройством в последующих вызовах.

• grantpt() изменяет владельца и права доступа ко вторичному устройству, соединенному с первичным концом псевдотерминала.

• unlockpt() разблокирует вторичное устройство, соединенное с первичным концом псевдотерминала, чтобы его можно было открыть.

• ptsname() возвращает имя вторичного устройства, соединенного с первичным концом псевдотерминала. После этого вторичное устройство может быть открыто с помощью вызова open().


60.2.1. Открытие неиспользуемого первичного устройства: вызов posix_openpt()

Функция posix_openpt() находит и открывает неиспользуемое первичное устройство псевдотерминала, после чего возвращает файловый дескриптор для дальнейшего обращения к этому устройству.

#define _XOPEN_SOURCE 600

#include

#include


int posix_openpt(int flags);

Возвращает файловый дескриптор при успешном завершении или -1 при ошибке

Аргумент flags может быть пустым или состоять из следующих флагов, к которым применено побитовое ИЛИ.

• O_RDWR — открывает устройство одновременно для чтения и записи. Обычно эта константа всегда включается в аргумент flags.

• O_NOCTTY — не делает данный терминал управляющим для текущего процесса. В Linux первичный конец псевдотерминала не может стать управляющим независимо от того, указан ли при вызове posix_openpt() флаг O_NOCTTY. (Здесь есть определенный смысл, поскольку первичный конец не является терминалом как таковым; это просто другая сторона терминала, к которой подключено вторичное устройство.) Однако в ряде систем флаг O_NOCTTY является обязательным, если мы не хотим, чтобы в результате открытия первичного устройства наш процесс обзавелся управляющим терминалом.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных