Читаем 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

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

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

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