Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - TTY-абстракция - TTY и система сигналов22 января 2011Оглавление: 1. TTY-абстракция 2. Сценарий использования 3. Место TTY в модели процессов 4. Управление заданиями и сессиями 5. TTY и система сигналов 6. Контроль потока и блокировка ввода-вывода 7. Настройка TTY Рассмотрим взаимодействие различных составляющих TTY с программами в пространстве пользователя. Как известно, во все файлы устройств, включая файлы устройств TTY, можно читать и писать, а также настраивать их при помощи универсального системного вызова Система сигналов довольно грубый способ взаимодействия. Дело в том, что, хотя процессы могут перехватывать сигналы и обрабатывать их, абсолютное большинство процессов этого не делает. В результате активируется обработчик по умолчанию, который, как правило, приводит к прекращению работы программы. Кроме того, для обработки сигналов нет общих чётких правил, и каждый сигнал приходится рассматривать по отдельности. Список всех сигналов доступен при помощи команды Конкретно к TTY имеют непосредственное отношение следующие сигналы: SIGHUPДействие по умолчанию: прекратить выполнение программы Возможные действия: прекратить выполнение программы, вызвать функцию, или ничего не делать Драйвер UART-порта посылает сигнал SIGHUP всей сессии, когда модем переходит в состояние «трубка повешена». Обычно это убивает все процессы сессии. Некоторые программы, такие как Screen или Nohup, отделяются от своей сессии и своего TTY, поэтому их дочерние процессы не умирают при отключении модема. SIGINTДействие по умолчанию: прекратить выполнение программы Возможные действия: прекратить выполнение программы, вызвать функцию, или ничего не делать Сигнал SIGINT генерируется драйвером TTY, когда во входном потоке появляется особый символ SIGQUITДействие по умолчанию: выход с дампом памяти ядра Возможные действия: выйти с дампом памяти ядра, вызвать функцию, или ничего не делать SIGQUIT аналогичен SIGINT, но Действие по умолчанию другое, и спецсимвол другой. SIGPIPEДействие по умолчанию: прекратить выполнение программы Возможные действия: прекратить выполнение программы, вызвать функцию, или ничего не делать Ядро посылает сигнал SIGPIPE процессу, который пытается писать данные в конвейер, из которого никто не читает. Этот сигнал очень полезен, потому что он позволяет конструкции типа SIGCHLDДействие по умолчанию: ничего не делать Возможные действия: вызвать функцию, или ничего не делать Ядро посылает сигнал SIGCHLD процессу, когда один из его дочерних процессов умирает либо меняет состояние. Вместе с сигналом SIGCHLD приходит некоторая дополнительная информация, такая как идентификаторы процесса и пользователя, код возврата, а также статистика использования процессорного времени. При помощи именно этого сигнала ведущий процесс сессии отслеживает выполнение своих заданий. SIGSTOPДействие по умолчанию: приостановить работу Возможные действия: приостановить работу Этот сигнал приостанавливает исполнение процесса, который его получает. Его нельзя перехватить. Как правило, ядро не использует этот сигнал. Вместо него спецсимвол SIGCONTДействие по умолчанию: пробудиться Возможные действия: пробудиться и, при желании, вызвать функцию Этот сигнал пробуждает усыплённый ранее процесс. Его посылает оболочка, когда пользователь вызывает команду SIGTSTPДействие по умолчанию: приостановить работу Возможные действия: приостановить работу, вызвать функцию, или ничего не делать SIGTSTP аналогичен SIGINT и SIGQUIT, но Действие по умолчанию другое, и спецсимвол другой. SIGTTINДействие по умолчанию: приостановить работу Возможные действия: приостановить работу, вызвать функцию, или ничего не делать Когда процесс, выполняющийся в фоновом режиме, пытается читать из TTY, TTY посылает этот сигнал всему заданию. Обычно это приостанавливает задание, до тех пор пока пользователь не переключится на него и не сможет ввести ожидаемые данные. SIGTTOUДействие по умолчанию: приостановить работу Возможные действия: приостановить работу, вызвать функцию, или ничего не делать Аналогичен предыдущему, но вызывается когда фоновый процесс пытается писать в TTY. Данный сигнал от данного TTY можно отключить. SIGWINCHДействие по умолчанию: ничего не делать Возможные действия: вызвать функцию, или ничего не делать Как уже упоминалось, TTY отслеживает размер терминала, однако информацию о нём нужно обновлять вручную. Для этого TTY посылает сигнал SIGWINCH активному заданию. Хорошо написанные программы, типа текстовых редакторов, адекватно реагируют на этот сигнал: узнают от TTY новый размер терминала и перерисовывают содержимое окна, чтобы оно выглядело соответствующе. ПримерРассмотрим следующий пример. Пусть пользователь редактирует текст в консольном текстовом редакторе. Курсор примерно посередине экрана, и редактор как раз занят выполнением задачи, требующей много процессорного времени. В этот момент пользователь нажимает Так как дисциплина была настроена на отлов этого символа, пользователю не придётся ждать, пока редактор закончит выполнение текущего задания, потому что слой дисциплины мгновенно пошлёт сигнал SIGTSTP активной задаче. Причём в эту группу входит не только сам редактор, но и все его дочерние процессы. Пусть редактор настроил ручную обработку сигнала SIGTSTP. Тогда ядро вызывает обработчик прерывания. Этот обработчик передвигает курсор на последнюю строку на экране, путём записи определённой последовательности управляющих символов в TTY. Так как редактор является активным процессом, эти символы незамедлительно передаются и обрабатываются. Затем редактор посылает сам себе сигнал SIGSTOP и засыпает. Тот факт, что текстовый редактор уснул, передаётся ведущему процессу сессии при помощи сигнала SIGCHLD. Когда засыпают все процессы активной задачи, ведущий процесс сессии запоминает текущие настройки TTY, и провозглашает себя активной задачей данного TTY при помощи системного вызова Если сейчас вызвать команду Если же вместо этого вызвать команду fg, оболочка восстановит сохранённые ранее настройки TTY, вновь сделает редактор активной задачей, и пошлёт ему сигнал SIGCONT. После этого редактор сможет нормально отрисовать свой интерфейс, и работа продолжится. Просмотров: 6756
|