Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Интернет: маркетинг, реклама, торговля" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Страницы справочного руководства ОС UNIX на русском : Основы ОС UNIX (8)
Информационный Канал Subscribe.Ru |
Выпуск 118
Уважаемые подписчики!
Сегодня вашему вниманию предлагается восьмая часть курса, посвященная
посылке и обработке сигналов процессами, а также
базовым средствам обработки текстов в ОС UNIX, в частности -
регулярным выражениям, поиску текста по образцу и программе grep.
Обратите внимание, что новости сайта OpenXS Initiative теперь публикуются достаточно регулярно в формате RSS.
Ваши отзывы об этих учебных материалах шлите мне по почте, в гостевую или оставляйте в комментариях на соответствующей странице проекта "Хроника бегства от безопасности".
Основы ОС UNIX. Учебный курс. Часть 8
Copyleft (no c) - Fuck copyright! 1999-2003 В. Кравчук, OpenXS Initiative, идея, составление, перевод, примеры
Управление приоритетом процессов
Во всех UNIX-системах пользователи могут при запуске процесса задавать значение поправки приоритета с помощью команды nice. (Говорят, что команда запускается "из- под" nice.) Эта команда имеет следующий синтаксис:
- nice [-инкремент | -n [-|+]инкремент] команда [аргумент...]
Диапазон значений инкремента в большинстве систем - от -20 до 20. Если инкремент не задан, используется стандартное значение 10. Положительный инкремент означает снижение текущего приоритета. Обычные пользователи могут задавать только положительный инкремент и, тем самым, только снижать приоритет.
Пользователь root может задать отрицательный инкремент, который повышает приоритета процесса и, тем самым, способствует его более быстрой работе:
# nice -n -10 make
Сигналы: посылка и обработка
Сигналы обеспечивают механизм вызова определенной процедуры при наступлении некоторого события (аналогично прерываниям). Каждое событие имеет свой числовой идентификатор (обычно в диапазоне от 1 до 36) и соответствующую символьную константу - имя. При работе с сигналами необходимо различать две фазы:
- Генерация или посылка сигнала.
- Доставка и обработка сигнала.
Сигнал отправляется, когда происходит определенное событие, о наступлении которого должен быть уведомлен процесс. Сигнал считается доставленным, когда процесс, которому был отправлен сигнал, получает его и выполняет его обработку. В промежутке между этими двумя событиями сигнал ожидает доставки.
Сигнал может посылаться одним процессом другому (с помощью соответствующего системного вызова ) и будет доставлен, если оба процесса - одного пользователя или сигнал послан от имени пользователя root. Сигналы посылаются также ядром.
Ядро генерирует и посылает процессу сигнал в ответ на ряд событий, которые могут быть вызваны самим процессом, другим процессом, прерыванием или каким либо внешним событием. Основные причины отправки сигнала:
- Исключительные ситуации
-
Выполнение процесса вызывает исключительну ситуацию, например, деление на 0.
- Терминальные прерывания
-
Нажатие клавиш терминала, например, <Del>, <Ctrl+C>, <Ctrl+\>,
вызывает посылку сигнала текущему процессу, связанному с терминалом.
- Другие процессы
-
Процесс может посылать сигнал другому процессу или группе процессов с
помощью системного вызова kill. В этом случае сигналы являются
элементарной формой межпроцессного взаимодействия.
- Управление заданиями
-
Командные интерпретаторы, поддерживающие средства управления
заданиями, используют сигналы для манипулирования фоновыми и
текущими процессами. Когда процесс, выполняющийся в фоновом режиме,
делает попытку чтения или записи на терминал, ему посылается сигнал
останова. Когда порожденный процесс завершает свою работу,
родительский процесс уведомляется об этом также с помощью сигнала.
- Квоты
-
Когда процесс превышает выделенную ему квоту вычислительных ресурсов
или ресурсов файловой системы, ему посылается соответствующий сигнал.
- Уведомления
-
Процесс может запросить уведомление о наступлении тех или иных
событий, например, готовности устройства и т.д. Такое уведомление
посылается процессу в виде сигнала.
- Будильники
- Если процесс установил таймер, ему будет послан сигнал, когда значение таймера станет равным 0.
Доставка и обработка сигнала
Для каждого сигнала в системе определена обработка по умолчанию, которую выполняет ядро, если процесс не указал другого действия. В общем случае возможны действия: завершить выполнение процесса (с созданием образа памяти core и без), игнорировать сигнал, остановить процесс и продолжить процесс.
Следует заметить, что любая обработка сигнала, в том числе и обработка по умолчанию, подразумевает, что процесс выполняется. На системах с высокой загрузкой это может привести к задержкам между отправлением и доставкой сигнала, т.к. процесс не может получить сигнал, пока не будет выбран планировщиком, и ему не будут предоставлены вычислительные ресурсы.
Доставка сигнала происходит после того, как ядро от имени процесса вызывает системную процедуру issig(), которая проверяет, существуют ли ожидающие доставки сигналы, адресованные данному процессу. Процедура issig() вызывается ядром в трех случаях:
- Непосредственно перед возвращением из режима ядра в пользовательский режим после обработки системного вызова или прерывания.
- Непосредственно перед переходом процесса в состояние сна с приоритетом, допускающим прерывание сигналом.
- Сразу же после пробуждения после сна с приоритетом, допускающим прерывание сигналом.
Если процедура issig() обнаруживает ожидание доставки сигнала, ядро вызывает функцию доставки сигнала, которое выполняет действие по умолчанию или вызывает специальную функцию sendsig(), запускающую обработчик сигнала, зарегистрированный процессом. Функция sendsig() возвращает процесс в пользовательский режим, передает управление обработчику сигнала, а затем восстанавливает контекст процесса для продолжения прерванного сигналом выполнения.
Работа с сигналами, связанными с исключительными ситуациями, незначительно отличается от описанной выше. Исключительная ситуация возникает при выполнении процессом определенной инструкции, вызывающей в системе ошибку. Если такое происходит, вызывается системный обработчик исключительной ситуации, и процесс переходит в режим ядра, почти так же, как и при обработке любого другого прерывания. Обработчик отправляет процессу соответствующий сигнал, который доставляется, когда процесс возвращается в пользовательский режим.
В состоянии сна существуют две категории событий, вызвавших состояние сна процесса: допускающие прерывание сигналом и не допускающие такого прерывания. В последнем случае сигнал будет терпеливо ожидать нормального пробуждения процесса.
Основные сигналы
Информация об основных сигналах представлена в табл. 18.
Таблица 18. Основные сигналы
Сигнал | Стандартная обработка | Значение |
SIGTERM 15 |
Завершение процесса | Стандартный сигнал, посылаемый для остановки процесса. |
SIGHUP 1 |
Завершение процесса | Отключился терминал (или закрыто терминальное окно). Сигнал посылается всем не фоновым процессам, связанным с соответствующей терминальной линией. |
SIGKILL 9 |
Завершение процесса | Не перехватываемый сигнал, позволяющий завершить любой процесс. |
SIGILL 4 |
Завершение процесса и сброс образа памяти | На центральный процессор была послана запрещенная инструкция. Это могло быть следствием недопустимого перехода в машинном коде программы, например, попытки выполнить строку данных. |
SIGTRAP 5 |
Завершение процесса и сброс образа памяти | Была установлена ловушка точки прерывания процесса. Этим управляет системный вызов ptrace, который полезен для отладки. |
SIGFPE 8 |
Завершение процесса и сброс образа памяти | Была попытка выполнить запрещенную арифметическую операцию, например, взятие логарифма отрицательного числа или деление на 0. |
SIGBUS 10 |
Завершение процесса и сброс образа памяти | Ошибка на шине ввода-вывода. Обычно это является результатом попытки выполнить чтение или запись вне границ памяти программы. |
SIGSEGV 11 |
Завершение процесса и сброс образа памяти | Это нарушение сегментации - проклятие разработчиков программ! Оно означает, что вы попытались получить доступ к сегменту памяти запрещенным образом. Может быть, это было присваивание значения части сегмента кода или чтение из нулевого адреса. |
SIGPIPE 13 |
Завершение процесса | Программа попыталась выполнить чтение или запись в программный канал, другой конец которого уже завершил работу. Этот сигнал помогает завершить работу конвейера, когда одна из его команд дала сбой. |
SIGALRM 14 |
Завершение процесса | Программист может установить будильник, чтобы позволить вам в определенный момент времени выполнить какое-нибудь действие. |
SIGCHLD 18 |
Игнорируется | Сначала это был сигнал завершения работы дочернего процесса, но сейчас он означает изменение состояния дочернего процесса. |
SIGTSTP 24 |
Остановка процесса | Это запрос от терминала на остановку процесса. Посылка этого сигнала процессу происходит при нажатии комбинации клавиш Ctrl-Z. |
SIGCONT 25 |
Игнорируется | Этот сигнал указывает процессу на возобновление его работы. Процессу посылается либо команда fg, либо bg, а командный интерпретатор выполняет внутренний системный вызов wait для привилегированного процесса, либо не выполняет его для фонового процесса. |
Детальная информация о сигналах представлена на страницах справочного руководства signal.
Процесс с помощью системного вызова signal() может задать нестандартный обработчик любого сигнала, кроме SIGKILL (9).
Посылка сигналов
Для посылки сигналов из командного интерпретатора используется команда kill. Она имеет следующий синтаксис:
- kill [ -сигнал ] pid ...
Эта команда посылает указанный сигнал (по умолчанию - SIGTERM) всем процессам с указанными идентификаторами. Посылать сигнал можно и не существующему процессу - выдается предупреждение, но другим процессам сигнал посылается. Посылаемый сигнал задается по имени без префикса SIG или по номеру, например:
[kravchuk@arturo 16:56:55 /]$ echo $$ 3697 [kravchuk@arturo 16:56:58 /]$ kill -STOP 3697
В результате текущий сеанс зависает.
Средства обработки текста
Редактирование и вообще обработка текстов - одна из основных операций, выполняемых на компьютерах. Стандартные средства редактирования в ОС UNIX появились давно и ориентированы на простейшие текстовые терминалы. К таким средствам можно отнести строковый редактор ed и экранный редактор vi. При первом знакомстве они могут показаться сложными и явно устаревшими с точки зрения "дружественности", однако в мире UNIX хорошо не то, что является самым новым и "красивым", а, скорее, то, что используется давно, многими людьми и есть в любой версии. Это в полной мере относится к стандартным средствам обработки текстов.
Регулярные выражения и сопоставление с образцом
Эффективность обработки текста определяется эффективностью поиска необходимых фрагментов. Для задания образцов поиска в ОС UNIX используется ряд метасимволов регулярных выражений, впервые появившихся в редакторе ed и представленных в табл. 19.
Таблица 19. Метасимволы регулярных выражений
Метасимвол | Описание |
c | Любой конкретный символ задает совпадение с таким же символом |
\c | Отменяет специальный смысл символа c |
^ | Соответствует началу строки, когда ^ начинает образец |
$ | Соответствует концу строки, когда $ заканчивает образец |
. | Совпадает с любым одиночным символом |
[...] | Соответствует одному любому символу в ...; допустимы диапазоны типа a-z |
[^...] | Соответствует любому одиночному символу, не входящему в ...; допустимы диапазоны |
r* | Соответствует нулевому или более числу вхождений r, где r - символ или [...] |
& | Используется только в правой части команд замены (s); вставляет фрагмент, совпавший с образцом |
\(...\) | Помечает регулярное выражение; найденные строки доступны как \1, \2 и т.д. до \9 в левой и правой частях соответствующей команды замены s, а также в шаблонах поиска сразу после закрытия соответствующей круглой скобки. |
Примеры регулярных выражений
Простые примеры регулярных выражений и задаваемых ими шаблонов поиска представлены в табл. 20.
Таблица 20. Примеры использования регулярных выражений
Образец | Соответствие |
/^$/ | пустая строка, т.е. только конец строки |
/./ | непустая строка, по крайней мере один символ |
/^/ | все строки |
/thing/ | thing где-либо в строке |
/^thing/ | thing в начале строки |
/thing$/ | thing в конце строки |
/^thing$/ | строка, состоящая лишь из thing |
/thing.$/ | thing плюс любой символ в конце строки |
/\/thing\// | /thing/ где-либо в строке |
/[tT]hing/ | thing или Thing где-либо в строке |
/thing[0-9]/ | thing, за которой идет одна цифра |
/thing[^0-9]/ | thing, за которой идет не цифра |
/thing1.*thing2/ | thing1, затем любая строка, затем thing2 |
/^thing1.*thing2$/ | thing1 в начале и thing2 в конце |
Помеченные регулярные выражения
Чтобы манипулировать не только целыми фрагментами, выбираемыми регулярными выражениями, но и их частями, используются помеченные регулярные выражения: если конструкция \(...\) появляется в регулярном выражении, то часть соответствующего ей фрагмента доступна как \1. Допускается использование до девяти помеченных выражений, на которые ссылаются \1, \2 и т.д.
Вот ряд примеров использования помеченных регулярных выражений:
s/\(...\)\(.*\)/\2\1/ | Поместить 3 первых символа в конец строки |
/\(..*\)\1/ | Найти строки, содержащие повторяющиеся смежные цепочки символов |
s/^\(..*\)\.\(..*\)/\1.\ \2/ | Перенести остаток строки после первой точки на следующую строку |
Поиск в тексте по образцу - утилита grep
Программы семейства grep осуществляют поиск шаблона (задаваемого на языке регулярных выражений) в указанных файлах или во входном потоке и (обычно) выдают соответствующие шаблону строки в выходной поток. В это семейство входят три программы, grep, egrep и fgrep, отличающиеся алгоритмами (а, значит, скоростью работы и используемыми ресурсами системы) и, частично, возможностями при задании шаблонов.
Вызов программы grep
Вызов команды grep имеет следующий синтаксис:
- grep [опции] [регулярное_выражение] [файл ...]
Команда ищет строки, задаваемые шаблоном в виде ограниченного регулярного выражения (используют подмножество допустимых алфавитно-цифровых и специальных символов), аналогичного используемым в ed, в указанных файлах или во входном потоке. Возможные опции приведены в табл. 21.
Таблица 21. Опции командной строки grep
Опция | Назначение |
-b | Перед каждой строкой выдавать номер блока, в котором она найдена. Это может пригодиться при определении номера блока по контексту |
-c | Выдавать только количество строк, соответствующих шаблону |
-i | Игнорировать разницу между прописными и строчными буквами |
-h | Предотвращает выдачу имени файла перед совпавшей строкой. Используется при многофайловом поиске. |
-l | Выдавать имена файлов, содержащих совпавшие строки, один раз, разделяя их переводом строки. Не повторяет имена файлов, если шаблон найден более одного раза. |
-n | Предваряет каждую строку ее порядковым номером (первая строка имеет номер 1) |
-s | Подавляет выдачу сообщений об ошибках, связанных с не существованием файлов или недоступностью для чтения |
-v | Выдает все строки, кроме тех, что содержат шаблон |
-e se | Ищет специальное выражение se (полное регулярное выражение, начинающееся с -) |
-f файл | Берет список полных регулярных выражений из файла |
Будьте внимательны при использовании символов $, *, [, ^, |, (, ) и \ в шаблоне, так как они также имеют значение для командного интерпретатора. Лучше заключать искомый шаблон в апострофы: '...'.
Статус выхода равен 0, если найдены совпадающие строки, 1 - если строки не найдены и 2 если имеется синтаксическая ошибка или недоступные файлы (даже если совпадения найдены).
Рассмотрим простые примеры:
[kravchuk@arturo 17:30:29 /]$ echo abc abc | grep '\([abc][abc]*\) \1' abc abc [kravchuk@arturo 17:31:13 /]$ echo abc abc | grep 'c a' abc abc [kravchuk@arturo 17:31:22 /]$ echo abc abc | grep '^c a' [kravchuk@arturo 17:31:26 /]$ cd $INFORMIXDIR/etc [kravchuk@arturo 17:31:45 /usr/inf.731/etc]$ grep -n $INFORMIXDIR ^C [kravchuk@arturo 17:32:03 /usr/inf.731/etc]$ grep -n tmp *.sh beta_evidence.sh:306: DUMPDIR=/tmp bldutil.sh:40:# remove tmp salvage_file bldutil.sh:55: RESFILE=/tmp/bldutil.$$ evidence.sh:302: DUMPDIR=/tmp logevent.sh:46:TMPFILE=${TMPDIR:-/tmp}/$PROG.`date +%y-%m-%d-%H%M-%S`
В следующем выпуске
Следующая часть учебного курса "Основы ОС UNIX". Следите за новостями на сайте рассылки.С наилучшими пожеланиями,
В.К.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||