Компания ALT Linux
Опубликован: 14.12.2004 | Доступ: свободный | Студентов: 12242 / 1449 | Оценка: 4.19 / 3.84 | Длительность: 18:18:00
ISBN: 978-5-9556-0019-1
Лекция 8:

Устройства, терминалы и процессы

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

Терминальная линия

Подобно тому как понятие "устройство" обозначает и внешнее устройство -"железяку", и его логическое представление внутри системы, понятие "терминал" применяется и к описанным выше устройствам первого типа, и к специальным устройствам второго типа, именуемым tty. Подав команду ls /dev/*tty*, мы можем обнаружить подчас несметное количество устройств с именем, включающим в себя tty. Все эти устройства - терминалы, или терминальные линии [ 6 ] о терминальной линии рассказывается достаточно подробно; мы же ограничимся довольно поверхностным рассмотрением, достаточным для того, чтобы у пользователя не возникало тупиковых ситуаций в работе). С точки зрения UNIX терминальные линии - не просто устройства, передающие байты: некоторые из этих байтов (например, уже рассмотренные нами в лекции 7 символы удаления) имеют специальное значение. В самом деле, при наборе текста в терминале символ удаления текущего ввода (обычно это ^U ) обрабатывает сама система (читай: терминальная линия ), а программа, которая ждет ввода данных, этого не замечает. Интерфейсом командной строки подсказан построчный режим работы терминальной линии: все, что вводится пользователем, обрабатывается ею и накапливается в специальном буфере, покуда не придет символ конца строки. После этого весь буфер передается ожидающей ввода программе ( shell, например), а линия начинает заполнять новый.

Поведение терминальной линии не зависит от способностей терминала: это свойство самой системы, так называемый обработанный режим передачи данных (cooked mode). В некоторых случаях, например если программа хочет самостоятельно обрабатывать все вводимые символы, терминальную линию можно перевести в "сырой" режим (raw mode). Всевозможные настройки терминальной линии выдает команда stty -a (или stty --all ). В числе прочих настроек линии будут, например, настройки преобразования символов перевода строки (LF) и возврата каретки (CR) друг в друга при вводе и выводе. В UNIX принято, что строки в текстовом файле завершаются одним символом - New Line, NL. Этот символ обычно приравнивается к символу перевода строки, LF. Между тем на многих терминалах при выводе строки необходимы, как на печатной машинке, два символа: сначала - CR, потом - LF. Иногда терминалам достаточно одного символа, но CR. И наоборот, при вводе с клавиатуры клавиша Enter может посылать и LF, и CR, и CR+LF. Некоторые настройки stty определяют, что UNIX должен понимать как NL при вводе с клавиатуры и выводе на экран текущего терминала.

В выдаче stty -a мы обнаружим знакомые команды: ^C, ^D, ^U и т. д. Что они значат? Команда stty позволяет переопределить простейшие команды удаления вводимого текста: удаление символа ( erase, как правило, это - ^H или ^?), слова ( werase, как правило, ^W ) и всей строки ( kill, как правило, ^U ). Зачем это бывает нужно? К примеру, терминал Volker Craig возвращает ^U при нажатии стрелки вправо. Хотелось бы, чтобы этот символ передавался программе, а не обрабатывался терминальной линией. Команда stty kill ^E переопределит команду удаления всей введенной строки на Ctrl+E. Обратите внимание: ^E в аргументах утилиты - это два символа, stty облегчает нам работу, соблюдая договоренность о представлении управляющих последовательностей.

Другая группа команд управляет самой терминальной линией: если, например, мы хотим приостановить вывод на экран довольно объемного текста (позабыв вовремя воспользоваться утилитой more или less ), можно использовать команду stop (обычно ^S ): она сообщит системе, что терминал временно не принимает данные, и очередная операция записи не завершится до тех пор, пока линия не получит команду start ( ^Q ). Если некая программа уже прочла все данные из файла, то очередная операция чтения завершится с диагностикой EOF (End Of File), которую программа должна обработать. Если же чтение идет с терминала, что для самой программы неотличимо от чтения из файла, команда терминальной линии eof (обычно ^D ) приведет к тому же результату.

Третья группа команд имеет особенное значение. Это способ подавать программе, обменивающейся данными с нашим терминалом, сигналы с клавиатуры. Как сказано в [ 35 ] , сигнал - это способ обмена короткими сообщениями между процессами в UNIX. По логике работы сигнал на системном уровне напоминает прерывание на аппаратном. Процесс может игнорировать сигнал, перехватывать (обрабатывать его) или оставлять на обработку системе. Сигнал процессу может исходить от другого процесса, а может зародиться в недрах системы. Сигналов не очень много; для обозначения различных, с точки зрения отправителя сигнала, ситуаций используются разные сигналы. В частности, для полной остановки процесса используется команда терминальной линии intr (обычно это ^C ), которая подает сигнал INT (от interrupt, прерывание) процессу, чей стандартный ввод связан с этим терминалом.

Процессы и сигналы

С конкретной терминальной линией может быть связан по вводу только один процесс. Этот процесс называется активным и, помимо свойства принимать сигналы с клавиатуры, единственный может считывать с нее данные. Остальные запускаемые пользователем процессы могут только выводить на терминал, вводить они должны откуда-нибудь еще. Эти процессы называются фоновыми. Если процесс, получивший сигнал INT, не станет его обрабатывать, система прекращает его работу. При этом активным становится родительский процесс, и т. д. вплоть до демона getty, который и есть первый процесс, связанный по вводу с терминальной линией. Более подробно о getty будет рассказано ниже, а про терминальные линии, группы процессов и пр. можно прочитать в [ 6 ] .

Если необходимо остановить процесс во что бы то ни стало, следует использовать сигнал QUIT ( quit, обычно ^\ ), который обычно не перехватывается. Процесс можно приостановить при помощи сигнала STOP ( susp, ^Z ). Тогда он временно остановится, перестанет быть активным и не будет работать до тех пор, пока не получит сигнал CONT (уже не с клавиатуры, потому что, перестав быть активным, он потеряет к ней доступ; многие командные интерпретаторы имеют команды fg и bg для того, чтобы приостановленный процесс продолжил работать как активный или как фоновый соответственно).

Кстати, отправкой сигналов процессам не с клавиатуры, а программным путем занимается утилита kill. Ей передается обязательный параметр - идентификатор процесса (PID), и необязательный - имя или номер сигнала. По умолчанию kill посылает сигнал TERM, но с ее помощью можно послать самый страшный сигнал, KILL, игнорировать который никакая программа не вправе. Чем не повод для именования утилиты? Для того чтобы приостановить фоновый процесс с PID, например 1495, надо сказать kill -STOP 1495, а для того, чтобы процесс возобновил работу, - kill -CONT 1495. Во многих версиях UNIX существует утилита killall, которой вместо PID можно указать имя запущенной программы, но, во-первых, процессов, образованных запуском одной и той же программы, может быть несколько, и killall пошлет сигнал каждому, а во-вторых, в некоторых ветках UNIX (например, в Solaris), эта утилита игнорирует все параметры и... делает то, что можно в таком случае ожидать: убивает всех! Для того чтобы узнать PID процесса, иногда задействуют утилиту pidof, но это можно сделать, просто просмотрев выдачу ps - утилиты, выводящей таблицу процессов.

Как уже отмечалось, первой система связывает с терминалом системную утилиту getty, задача которой - определить тип терминала и параметры ввода/вывода, когда на линии возникнет активность, настроить линию и вызвать системную утилиту, которая займется пользовательскими делами (чаще всего - утилиту login для аутентификации пользователя). Настраивать линию не так-то просто, если к ней подсоединен модем, и действительным терминальным устройством может оказаться какой угодно терминал пользователя. Когда работа с линией закончена, модем "вешает трубку", а работающая с линией программа получает сигнал HUP (от Hang UP). При получении этого сигнала система должна забыть все старые настройки терминальной линии (пользователь-то отсоединился) и перезапустить getty. Правила запуска getty и других обработчиков терминальной линии указываются в /etc/inittab (для гнезда USG) или в /etc/ttys (для гнезда BSD). Это породило еще одну договоренность UNIX: если демон получает сигнал HUP, он должен перезапуститься и заново считать настройки; например, если мы изменили настроечный файл inetd, он заметит эти изменения после killall -HUP inetd.

Если в компьютере есть порт последовательной передачи данных (на IBM PC он обычно отвечает стандарту RS-232), он вполне подойдет для терминала. Поэтому в /dev будет соответствующее ему терминальное устройство с именем, содержащим подстроку tty: в Linux, например, оно будет носить имя ttyS0, а в FreeBSD - ttyd0. В FreeBSD, кстати, предусмотрено еще одно устройство, cuaa0, которое в действительности работает с тем же портом, но передаваемые данные не обрабатывает и сигналов не передает; одним словом, работает в "сыром" режиме. Редко когда последовательных портов у системы больше четырех (чаще их два). Откуда же тогда такой объем выдачи у ls /dev/*tty*?

Современная UNIX-система на основе IBM PC вообще не включает в себя такое внешнее устройство, как терминал. Да оно и незачем: в состав системного блока входят и клавиатура, и монитор, способный отображать графическую, а значит, и текстовую информацию. Правда, это вполне независимые устройства: нажатие клавиш на клавиатуре обрабатывает специальное устройство под названием контроллер клавиатуры, а монитор отображает состояние графического адаптера. Однако некая часть ядра системы, именуемая виртуальной консолью, выполняет функции терминала, работая с монитором и клавиатурой как с единым устройством. Под консолью в UNIX подразумевается терминал (возможно, не единственный), на который сама система выводит диагностику при работе и с которого ею можно управлять. Назначение виртуальной консоли в том, чтобы пользователь сидел за клавиатурой и монитором IBM PC как за терминалом, а UNIX "думал", что такой терминал у него всегда есть. Причем для удобства работы виртуальных консолей обычно организуется сразу несколько, нажатие в Linux или FreeBSD Alt+F6 приведет к тому, что вы окажетесь как бы перед терминалом с номером 6 и начнете работать с ним, а запущенная на устройстве /dev/tty6 (для FreeBSD - /dev/ttyv6 ) программа getty обнаружит активность именно на этом устройстве.

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Andranik Avakian
Andranik Avakian

41. УК РФ и Комментарии (ст. 273)

М. 2000 г. Издательство: ALT Linux, Институт Логики

Уголовный Кодекс РФ и комментарии к нему?

По ссылке открывается сайт документации Linux, раздел Linux Installation and Getting Started

Сергей Петровский
Сергей Петровский

У Вас написано:

ls -dt1 `grep -il отчет *` | head -1

если знания по шелу мне не изменяют, то должно быть:

ls -dt | `grep -il отчет *` | head -1