Интернет магазин китайских планшетных компьютеров



Компьютеры - TTY-абстракция - TTY и система сигналов

22 января 2011


Оглавление:
1. TTY-абстракция
2. Сценарий использования
3. Место TTY в модели процессов
4. Управление заданиями и сессиями
5. TTY и система сигналов
6. Контроль потока и блокировка ввода-вывода
7. Настройка TTY



Рассмотрим взаимодействие различных составляющих TTY с программами в пространстве пользователя.

Как известно, во все файлы устройств, включая файлы устройств TTY, можно читать и писать, а также настраивать их при помощи универсального системного вызова ioctl русск.. Однако системный вызов ioctl должен быть вызван самим процессом, поэтому он не позволяет ядру асинхронно общаться с приложением. Для таких случаев есть система сигналов.

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

Список всех сигналов доступен при помощи команды kill -l.

Конкретно к TTY имеют непосредственное отношение следующие сигналы:

SIGHUP

Действие по умолчанию: прекратить выполнение программы

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

Драйвер UART-порта посылает сигнал SIGHUP всей сессии, когда модем переходит в состояние «трубка повешена». Обычно это убивает все процессы сессии. Некоторые программы, такие как Screen или Nohup, отделяются от своей сессии и своего TTY, поэтому их дочерние процессы не умирают при отключении модема.

SIGINT

Действие по умолчанию: прекратить выполнение программы

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

Сигнал SIGINT генерируется драйвером TTY, когда во входном потоке появляется особый символ ^C. Драйвер посылает этот сигнал активному заданию. Программа, имеющая доступ к TTY, может изменить код этого спецсимвола, либо вообще отключить генерацию этого сигнала. Менеджер сессий отслеживает настройки TTY, установленные каждой из работающих задач, и применяет их, когда эти задачи переключаются.

SIGQUIT

Действие по умолчанию: выход с дампом памяти ядра

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

SIGQUIT аналогичен SIGINT, но Действие по умолчанию другое, и спецсимвол другой.

SIGPIPE

Действие по умолчанию: прекратить выполнение программы

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

Ядро посылает сигнал SIGPIPE процессу, который пытается писать данные в конвейер, из которого никто не читает. Этот сигнал очень полезен, потому что он позволяет конструкции типа yes | head нормально отработать и завершиться, а не зависнуть.

SIGCHLD

Действие по умолчанию: ничего не делать

Возможные действия: вызвать функцию, или ничего не делать

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

SIGSTOP

Действие по умолчанию: приостановить работу

Возможные действия: приостановить работу

Этот сигнал приостанавливает исполнение процесса, который его получает. Его нельзя перехватить. Как правило, ядро не использует этот сигнал. Вместо него спецсимвол ^Z посылает сигнал SIGTSTP, который уже может быть отловлен приложением; как правило, приложение выполняет определённые действия, после чего само себя ставит на паузу — уже сигналом SIGSTOP.

SIGCONT

Действие по умолчанию: пробудиться

Возможные действия: пробудиться и, при желании, вызвать функцию

Этот сигнал пробуждает усыплённый ранее процесс. Его посылает оболочка, когда пользователь вызывает команду fg. Так как этот сигнал нельзя отловить, неожиданный сигнал SIGCONT означает, что процесс был приостановлен, а затем пробудился.

SIGTSTP

Действие по умолчанию: приостановить работу

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

SIGTSTP аналогичен SIGINT и SIGQUIT, но Действие по умолчанию другое, и спецсимвол другой.

SIGTTIN

Действие по умолчанию: приостановить работу

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

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

SIGTTOU

Действие по умолчанию: приостановить работу

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

Аналогичен предыдущему, но вызывается когда фоновый процесс пытается писать в TTY. Данный сигнал от данного TTY можно отключить.

SIGWINCH

Действие по умолчанию: ничего не делать

Возможные действия: вызвать функцию, или ничего не делать

Как уже упоминалось, TTY отслеживает размер терминала, однако информацию о нём нужно обновлять вручную. Для этого TTY посылает сигнал SIGWINCH активному заданию. Хорошо написанные программы, типа текстовых редакторов, адекватно реагируют на этот сигнал: узнают от TTY новый размер терминала и перерисовывают содержимое окна, чтобы оно выглядело соответствующе.


Пример

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

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

Пусть редактор настроил ручную обработку сигнала SIGTSTP. Тогда ядро вызывает обработчик прерывания. Этот обработчик передвигает курсор на последнюю строку на экране, путём записи определённой последовательности управляющих символов в TTY. Так как редактор является активным процессом, эти символы незамедлительно передаются и обрабатываются. Затем редактор посылает сам себе сигнал SIGSTOP и засыпает.

Тот факт, что текстовый редактор уснул, передаётся ведущему процессу сессии при помощи сигнала SIGCHLD. Когда засыпают все процессы активной задачи, ведущий процесс сессии запоминает текущие настройки TTY, и провозглашает себя активной задачей данного TTY при помощи системного вызова ioctl. После этого он печатает на экране уведомление для пользователя, что текущая задача была приостановлена.

Если сейчас вызвать команду ps, она покажет, что текстовый редактор приостановлен. При попытке пробудить его — например, встроенной в оболочку командой bg, или же командой kill послав ему сигнал SIGCONT, — редактор запустит обработчик сигнала SIGCONT. Этот обработчик попытается перерисовать интерфейс путём записи последовательности управляющих символов в TTY. Однако теперь редактор — фоновый процесс, поэтому вместо отрисовки интерфейса, TTY пошлёт редактору сигнал SIGTTOU, и тот опять уснёт. Ведущий процесс сессии узнает об этом при помощи сигнала SIGCHLD, и опять выведет на экран уведомление для пользователя.

Если же вместо этого вызвать команду fg, оболочка восстановит сохранённые ранее настройки TTY, вновь сделает редактор активной задачей, и пошлёт ему сигнал SIGCONT. После этого редактор сможет нормально отрисовать свой интерфейс, и работа продолжится.



Просмотров: 6542


<<< The UNIX-HATERS Handbook
Umask >>>