Как Terminal.app обнаруживает изменение параметров терминала?
В ответ на другой вопрос Крис Пейдж сказал, что Терминал может определить, когда параметры терминала находятся в состоянии, которое, вероятно, будет для ввода пароля. Например, терминал может быть в готовом режиме с отключенным эхом символа.
Как Терминал обнаруживает это? Есть ли API, где вы можете подписаться на изменения параметров терминала? Терминал опрашивает? Отправляется ли на терминал специальный символ при изменении параметров терминала?
3 ответа
Терминал опрашивает состояние устройства tty, используя tcgetattr(3) x-man-page://3/tcgetattr, и проверяет, установлен ли флаг ICANON c_lflag, а флаг ECHO - нет.
Он опрашивается после получения вывода от удаленной программы или когда пользователь вводит текст с использованием встроенного метода ввода, который, возможно, необходимо заблокировать для отображения ввода пользователя в виде "помеченного" текста.
Поскольку Terminal.app является закрытым исходным кодом, никто не может сделать больше, чем предположить, что именно он делает (опрос или некоторая функция уведомлений, предоставляемая Apple). В любом случае, он имеет полный контроль над данными, перемещающимися между псевдотерминалами master / slave, и может опрашивать их, используя вызовы POSIX termios, такие как tcgetattr чтобы увидеть текущие режимы терминала.
Приложение Terminal связывается с процессом оболочки (bash) через устройство pty (pseudotty). Когда bash или другой процесс переходит в режим "пароля", он изменяет свойства устройства pty, отправляя управляющую последовательность ANSI
Я не уверен, что другой процесс может перехватить связь (нужно проверить мои книги по POSIX).