Псевдотермінали

Псевдотермінали є спеціальним пристроєм, що емулює стандартну термінальну лінію. Псевдотермінали нагадують канали як засіб міжпроцесної взаємодії, що дозволяє двом процесам обмінюватися даними. Однак, на відміну від каналів, псевдотермінали забезпечують додаткову функціональність, специфічну для термінальних ліній. Схематично архітектура псевдотерміналу представлена ​​на рис. 5.11.

користувача

Мал. 5.11. Взаємодія процесів за допомогою псевдотерміналу

Яскравим прикладом використання псевдотерміналів є реєстрація в системі мережі з використанням серверів віддаленого доступу rlogin(1) або telnet(1), або використання графічного емулятора терміналу xterm в системі X Window System. Коли користувач реєструється в системі подібним чином, псевдотермінал емулює звичайну термінальну лінію, тому користувач не бачить різницю між віддаленою та локальною роботою за допомогою терміналу, підключеного по послідовній лінії. Наприклад, користувач може встановити різні режими обробки та використовувати відповідні комбінації клавіш для генерації сигналів, як він це робить у разі звичайного терміналу.

Псевдотермінал по суті є двома окремих драйвера. Один з них виглядає як звичайний термінальний драйвер і зветься підлеглим пристроєм (slave). Другий драйвер називається основним (master).

Оскільки підлеглий пристрій має всі характеристики терміналу, процес може зв'язати свої стандартні потоки введення, виведення та виведення помилок із цим пристроєм. Однак, на відміну від звичайного терміналу, у разі якого запис процесу призводить до відображення даних на фізичному пристрої, а введення даних користувачем з клавіатури може бути отримане читаннямтермінальної лінії, всі дані, записані в підпорядкований пристрій, передаються здебільшого і навпаки – майже так, як працює канал. Однак модуль дисципліни лінії дозволяє забезпечити додаткові можливості цього каналу, які можуть знадобитися деяким програмам, наприклад, командному інтерпретатору shell.

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

Користувач віддаленої системи запускає програму віддаленого доступу rlogin(1), яка формує запит і передає його мережею на необхідний комп'ютер. Там цей запит доставляється серверу віддаленого доступу rlogind(1), який (після належної перевірки) запускає програму login(1). При цьому стандартні потоки введення, виведення та виведення помилок програми login(1) зв'язуються не з термінальним файлом, як у разі входу в систему за допомогою сервера getty(1M), а з підпорядкованим пристроєм псевдотерміналу. Основний пристрій виявляється пов'язаним із сервером rlogind(1). Програма login(1) запитує ім'я користувача та його пароль точно так, як вона це робить при вході через getty(1M). Більш того, login(1) і "не уявляє", що насправді працює з емулятором терміналу, а не з традиційною термінальною лінією. Весь введення login(1) надходить серверу rlogind(1) і потім передається по мережі клієнтської частини rlogin(1) на віддаленому комп'ютері. Далі робота нічим не відрізняється від роботи локального користувача, підключеного до системи за допомогою звичайного терміналу чи консолі. Якщо ім'я користувача та пароль були введені правильно, програма login(1) запустить необхідний командний інтерпретатор (login shell), який також не помітить заміни. Дійсно, по всіххарактеристикам термінал буде відмінним від традиційної послідовної лінії, включаючи різні установки та генерацію сигналів при натисканні певних клавіш клавіатури. Слід, щоправда, зазначити, що оскільки псевдотермінал не є "повноцінним" термінальним пристроєм, частина установок для нього не мають сенсу (наприклад, швидкість передачі, парність тощо) і просто ігноруються.

На рис. 5.12 наведено схему роботи віддаленого користувача в системі з використанням псевдотерміналу.

віддаленого

Мал. 5.12. Архітектура віддаленого доступу з використанням псевдотерміналу