Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

хабовый архитектура сигнал плата




Интерфейс командной строки Unix System V

 

Пользователь ОС UNIX общается с системой через командный интерпретатор (shell) [2]. Через него происходит доступ к командам, файловой системе и другим функциям ядра UNIX. Это обычная программа (т.е. не входит в ядро операционной системы UNIX). Ее можно заменить другой или использовать несколько разных версий. Наиболее известны следующие версии:- классический интерпретатор версии UNIX V7, иначе называемый по фамилии автора Bourne shell.- интерпретатор Korn shell, дополняющий классический shell возможностями работы с заданиями пользователя, историей работы и позволяющий редактировать командную строку при помощи команд, аналогичных vi. Является фактически стандартом для POSIX-совместимых систем, в частности, UNIX System V.- стандартный интерпретатор BSD UNIX и производных от него систем. Отличается улучшенными диалоговыми возможностями, способом присваивания и экспортирования переменных в среду, управляющими конструкциями и рядом других моментов; тоже поддерживает историю и редактирование командной строки. Главное и, по моему мнению, отрицательное его отличие от других интерпретаторов, - это свои управляющие конструкции, не совпадающие с sh.- свободно распространяемый в виде исходных текстов интерпретатор, называемый "Bourne another shell", объединяющий все лучшее из остальных интерпретаторов с удобными возможностями редактирования командной строки и работы с историей команд. В настоящее время - фактический стандарт.

Рассмотрим структуру командной строки интерпретаторов sh и ksh (в классической версии 1988 года).

Командные строки рассматриваются по одной и имеют определенную структуру. Чтобы понять ее, рассмотрим ряд синтаксических определений:

 

<пробел>:=

<символ пробела> | <символ табуляции>

<имя>:=

<буква или подчеркивание> {<допустимый символ имени>}

<буква или подчеркивание>:=

<буква> | _

<допустимый символ имени>:=

<буква> | <цифра> | _

<параметр>:=

<имя> | <цифра> | * | @ | # |? | - | $ |!

<слово>:=

<не пробел> {<не пробел>}

<простая команда>:=

<слово> {<пробел> <слово>}

 

Итак, простая команда - это последовательность слов через пробел. Нажатие клавиши Enter при вводе команды или перевод строки при обработке сценария являются для командного интерпретатора признаком завершения команды. Она обрабатывается и выполняется.

Значением простой команды является ее статус выхода (см. далее) в случае нормального завершения или (восьмеричное) 200+статус при ненормальном завершении.

Пример простой команды:

 

$ who

oracle pts000 Aug 20 10:08console Aug 20 09:03pts004 Aug 20 12:45

$

 

Из простых команд строятся более сложные конструкции: конвейеры и списки.

 

<конвейер>:=

<команда> {| <команда>}

<список>:=

<конвейер> {<разделитель> <конвейер>} [<терминатор команды>]

<разделитель>:=

&& | || | <терминатор команды>

<терминатор команды>:=

; | &

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

 

$ ls | tee save | wc

15 15 100

$

 

Список - это последовательность одного или более конвейеров, разделенных;, &, && или || и, возможно, заканчивающаяся; или &. Из этих четырех символов,; и & имеют равный приоритет, который ниже, чем у && и || (эти символы тоже имеют равный приоритет). Точка с запятой (;) вызывает последовательное выполнение предшествующего конвейера (т.е. командный интерпретатор ожидает окончания конвейера перед выполнением любых команд, следующих за точкой с запятой). Амперсанд (&) вызывает асинхронное выполнение предшествующего конвейера (т.е. командный интерпретатор не ожидает окончания работы конвейера). Символ && (||) ведет к тому, что следующий за ним список выполняется только в том случае, когда предыдущий конвейер вернул нулевой (ненулевой) статус выхода. В список может входить произвольное количество переводов строк и точек с запятой, разделяющих команды.

Теперь можно дать общее определение команды:

 

<команда>:=

<простая команда> |

<оператор управления> |

<определение функции> |

<список> | (<список>) | { <список>; }

 

Список в круглых скобках выполняется в порожденном командном интерпретаторе. Круглые скобки обычно используют для группировки команд.

Список в фигурных скобках выполняется в текущем командном интерпретаторе, без порождения дополнительного процесса, и замещает образ командного интерпретатора (это аналог системного вызова exec).

Операторы управления и синтаксис определения функций рассматривается далее.

Рассмотрим пример сложной команды:

 

bash$ (sleep 5; date) & date

[1] 1148Aug 20 15:00:11???? 1997$ Wed Aug 20 15:00:16???? 1997

 

Фоновый процесс начинается, но сразу "засыпает"; тем временем вторая команда date выдает текущее время, а интерпретатор - приглашение для ввода новой команды. Через пять (примерно, зависит от загрузки системы и т.п.) секунд прекращается выполнение команды sleep и первая команда date выдает новое время.

Демоны

 

В ОС UNIX выделяется три типа процессов: системные, процессы-демоны и прикладные процессы [2].

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

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

Демоны - это не интерактивные процессы, которые запускаются обычным образом путем загрузки в память соответствующих им программ (исполняемых файлов), и выполняются в фоновом режиме. Обычно демоны запускаются при инициализации системы и обеспечивают работу различных подсистем UNIX. Демоны не связаны ни с одним пользовательским сеансом работы и не могут непосредственно управляться пользователем. Большую часть времени демоны ожидают пока тот или иной процесс запросит определенную услугу, например, доступ к файловому архиву или печать документа.

Некоторые демоны работают постоянно, наиболее яркий пример такого демона - процесс init(1M), являющийся прародителем всех прикладных процессов в системе. Другими примерами являются cron(1M), позволяющий запускать программы в определенные моменты времени, inetd(1M),обеспечивающий доступ к сервисам системы из сети, и sendmail(1M), обеспечивающий получение и отправку электронной почты.

Способы порождения и запуска "демонов" могут быть различны:

. В процессе старта системы из файла /etc/rc. Такие "демоны" будут работать в статусе суперпользователя во время работы ОС.

. Используя либо системный файл /usr/lib/crontab, либо пользовательский crontab. Обыкновенно стандартный системный процесс cron в течении дня выполняет определенные задачи, периодически выбирая свои команды для таких исполнений из файла /usr/lib/crontab.

. С помощью команды at "демон" ждет наступления заданного времени и выдает определенное задание.

. Запуск фонового процесса с помощью пользовательского терминала.

Сигналы UNIX

 

Сигналы обеспечивают механизм вызова определенной процедуры при наступлении некоторого события (аналогично прерываниям) [2]. Каждое событие имеет свой числовой идентификатор (обычно в диапазоне от 1 до 36) и соответствующую символьную константу - имя. При работе с сигналами необходимо различать две фазы:

) генерация или посылка сигнала;

) доставка и обработка сигнала.

Сигнал отправляется, когда происходит определенное событие, о наступлении которого должен быть уведомлен процесс. Сигнал считается доставленным, когда процесс, которому был отправлен сигнал, получает его и выполняет его обработку. В промежутке между этими двумя событиями сигнал ожидает доставки.

Сигнал может посылаться одним процессом другому (с помощью соответствующего системного вызова) и будет доставлен, если оба процесса - одного пользователя или сигнал послан от имени пользователя root. Сигналы посылаются также ядром.

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

) исключительные ситуации - выполнение процесса вызывает исключительну ситуацию, например, деление на 0;

) терминальные прерывания - нажатие клавиш терминала, например, <Del>, <Ctrl+C>, <Ctrl+\>, вызывает посылку сигнала текущему процессу, связанному с терминалом;

) другие процессы - процесс может посылать сигнал другому процессу или группе процессов с помощью системного вызова kill. В этом случае сигналы являются элементарной формой межпроцессного взаимодействия.

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

) квоты - когда процесс превышает выделенную ему квоту вычислительных ресурсов или ресурсов файловой системы, ему посылается соответствующий сигнал;

) уведомления - процесс может запросить уведомление о наступлении тех или иных событий, например, готовности устройства и т.д. Такое уведомление посылается процессу в виде сигнала.

) будильники - если процесс установил таймер, ему будет послан сигнал, когда значение таймера станет равным 0.

Для каждого сигнала в системе определена обработка по умолчанию, которую выполняет ядро, если процесс не указал другого действия. В общем случае возможны действия: завершить выполнение процесса (с созданием образа памяти core и без), игнорировать сигнал, остановить процесс и продолжить процесс.

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

Доставка сигнала происходит после того, как ядро от имени процесса вызывает системную процедуру issig(), которая проверяет, существуют ли ожидающие доставки сигналы, адресованные данному процессу. Процедура issig() вызывается ядром в трех случаях:

Непосредственно перед возвращением из режима ядра в пользовательский режим после обработки системного вызова или прерывания.

Непосредственно перед переходом процесса в состояние сна с приоритетом, допускающим прерывание сигналом.

Сразу же после пробуждения после сна с приоритетом, допускающим прерывание сигналом.

Если процедура issig() обнаруживает ожидание доставки сигнала, ядро вызывает функцию доставки сигнала, которое выполняет действие по умолчанию или вызывает специальную функцию sendsig(), запускающую обработчик сигнала, зарегистрированный процессом. Функция sendsig() возвращает процесс в пользовательский режим, передает управление обработчику сигнала, а затем восстанавливает контекст процесса для продолжения прерванного сигналом выполнения.

Работа с сигналами, связанными с исключительными ситуациями, незначительно отличается от описанной выше. Исключительная ситуация возникает при выполнении процессом определенной инструкции, вызывающей в системе ошибку. Если такое происходит, вызывается системный обработчик исключительной ситуации, и процесс переходит в режим ядра, почти так же, как и при обработке любого другого прерывания. Обработчик отправляет процессу соответствующий сигнал, который доставляется, когда процесс возвращается в пользовательский режим.

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

 

Таблица 4.1 - Основные сигналы

Сигнал Стандартная  обработка Значение
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 для привилегированного процесса, либо не выполняет его для фонового процесса.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...