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

2. Приняв сигнал SIGWINCH, родительский процесс script использует операцию ioctl() TIOCGWINSZ, чтобы извлечь структуру winsize для окна терминала, связанного с его стандартным вводом. Затем он передает эту структуру операции ioctl() TIOCSWINSZ, устанавливающей размер окна для первичного устройства псевдотерминала.

3. Если новый размер окна псевдотерминала отличается от старого, то ядро генерирует для активной группы процессов вторичного устройства сигнал SIGWINCH. Такие программы, как vi, манипулирующие экраном, перехватывают этот сигнал и выполняют операцию ioctl() TIOCGWINSZ, обновляя сведения о размере окна терминала.

Подробности о размере окна терминала и флагах TIOCGWINSZ и TIOCSWINSZ для вызова ioctl() описаны в разделе 58.9.


60.8. Резюме


Псевдотерминал состоит из двух соединенных между собой устройств: первичного и вторичного. Вместе они обеспечивают двунаправленный канал межпроцессного взаимодействия. Преимущество псевдотерминала состоит в том, что к его вторичному концу можно подключить программу, ориентированную на работу с терминалом, которая управляется другой программой, подключенной к первичному устройству. Вторичный конец ведет себя подобно обычному терминалу. В нем можно выполнять любые операции, доступные в традиционном терминальном устройстве, а данные, направляемые в него из первичного устройства, интерпретируются точно так же, как это происходит в обычном терминале с клавиатурным вводом.

Псевдотерминалы часто применяются в приложениях, которые дают возможность сетевого входа в систему. Но они также используются в других программах, таких как эмуляторы терминала и утилита script(1).

Программные интерфейсы псевдотерминалов, существующие в системах семейства BSD и System V, отличаются друг от друга. И тот, и другой поддерживаются в Linux, однако версия System V является основой для программного интерфейса, входящего в стандарт SUSv3.


60.9. Упражнения


60.1. В каком порядке завершаются родительский процесс программы script и ее потомок, который выполняет командную оболочку, когда пользователь вводит символ конца файла (обычно это Ctrl+D) во время работы программы из листинга 60.3? Почему?

60.2. Внесите следующие изменения в программу из листинга 60.3 (script.c).

• Стандартная программа script(1) добавляет строчки в начало и конец итогового файла, указывая время начала и завершения команды. Добавьте данную возможность.

• Добавьте код, который реагирует на изменение размера окна терминала, как описано в разделе 60.7. Возможно, для проверки этой функции вам пригодится программа demo_SIGWINCH.c из листинга 58.5.

60.3. Измените программу из листинга 60.3 (script.c), заменив вызов select() двумя процессами: один — для передачи данных от терминала к псевдотерминалу, а второй — наоборот.

60.4. Измените программу из листинга 60.3 (script.c), добавив возможность указывать временные метки. При записи каждой строчки в файл typescript эта программа должна записывать временную метку во второй файл (например, typescript.timed). Содержимое второго файла должно иметь следующий вид:

<временная метка> <пробел> <строка> <переход на новую строку>

Временная метка должна записываться в виде строки, состоящей из количества миллисекунд, прошедших с момента начала сессии программы. Запись временных меток в текстовом формате упрощает чтение итогового файла. Если внутри текста встречаются символы новой строки, то их следует экранировать. Например, его можно записать как последовательность из двух символов: \n и двойной косой черты \\.

Напишите вторую программу, script_replay.c, которая считывает итоговый файл с временными метками и направляет его содержимое в стандартный вывод с той же скоростью, с какой оно изначально записывалось. Вместе эти программы должны обеспечивать простой механизм для записи и воспроизведения сессии командной строки.

60.5. Реализуйте клиент-серверную программу, обеспечивающую удаленный вход в систему в стиле утилиты telnet. Сервер должен обслуживать клиентов в параллельном режиме (см. раздел 56.1). Конфигурация, которую нужно установить для входа каждого клиента, представлена на рис. 60.3. На этой диаграмме не показан родительский серверный процесс, обрабатывающий входящие клиентские соединения и создающий для их обработки дочерние процессы. Стоит отметить, что всю работу по аутентификации пользователя и запуску командной оболочки можно выполнять путем создания функции ptyFork() внутри каждого дочернего процесса еще одного потомка (внука), который запускает программу login(1).

60.6. Добавьте в программу, разработанную в предыдущем шаге, код, обновляющий файлы с учетными данными в начале и конце сессии командной строки (см. главу 40).

60.7. Представьте, что мы выполняем программу, которая работает длительное время и генерирует вывод, направленный в файл или именованный канал. Например:

$ longrunner | grep str

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

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

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#.Введите сюда краткую аннотацию

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

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