
- •И.Н.Акуленок, а.В.Акуленок
- •Часть I. Основы операционной системы unix Утверждено советом университета
- •Введение
- •Глава 1. История создания ос unix
- •Реализации oc unix
- •Unix на платформе Intel
- •Доля компьютеров с ос unix (1993 год)
- •Продажи unix–серверов (III квартал 2007 года)
- •1.1. Первые шаги по созданию unix
- •1.2. Исследовательские версии unix
- •1.3. Основные стандарты
- •1.3.1. Основные задачи стандартизации
- •1.4. Разработчики операционных систем
- •1.4.1. Версии at&t
- •1.4.2. Версии Microsoft/sco
- •1.4.3. Версии университета Беркли
- •1.4.4. Версии компании Sun
- •1.4.5. Версии компании Nowell
- •1.4.6. Популярные версии unix
- •1.4.7. Свободно распространяемые системы unix
- •1.5. Реализация ядра unix
- •1.5.1. Микроядро Mach
- •1.5.2. Микроядро Chorus
- •1.6 Характеристики oc unix
- •1.6.1.Файловая система
- •1.6.2. Многозадачность
- •1.6.3. Многопользовательский режим
- •1.6.4. Мобильность
- •1.6.5. Виртуальная память
- •1.6.6. Связь между задачами
- •1.6.7. Внешние устройства
- •1.6.8. Связь между компьютерами
- •1.6.9. Графический пользовательский интерфейс
- •1.6.10. Безопасность
- •1.6.11. Поддержка баз данных
- •1.6.12. Наличие стандартов
- •1.6.13. Открытость
- •1.6.14. Разработка программного обеспечения
- •1.7. Контрольные вопросы
- •1.8. Тесты
- •Глава 2. Функционирование ос unix
- •2.1. Ядро
- •2.1.1. Функции ядра
- •2.1.2. Структура ядра
- •2.1.3. Файловая подсистема
- •2.1.4. Подсистема управления процессами
- •2.1.5. Подсистема ввода/вывода
- •2.2. Командный процессор Shell
- •2.3. Программы–утилиты
- •2.4. Контрольные вопросы
- •2.5. Тесты
- •Глава 3. Процессы
- •3.1. Контекст процесса
- •3.3. Типы процессов
- •3.3.1. Системные процессы
- •3.3.2. Демоны
- •3.3.3. Прикладные процессы
- •3.4. Атрибуты процесса
- •3.4.1. Идентификатор процесса
- •3.4.2. Идентификатор родительского процесса
- •3.4.3. Приоритет процесса
- •3.4.4. Терминальная линия
- •3.4.5. Реальный и эффективный идентификаторы пользователя
- •3.4.6. Реальный и эффективный идентификаторы группы
- •3.4.7. Идентификатор терминальной группы
- •3.5. Иерархия процессов
- •3.6. Взаимодействие процессов
- •3.6.1. «Отцы», «дети», «сироты», «зомби»
- •3.7. Системные вызовы
- •3.7.1. Механизм создания процесса и запуска программы
- •3.7.2. Графический пример дерева процессов
- •3.8. Связи между процессами
- •3.8.1. Сигналы
- •Сигналы posix 1.1
- •3.8.2. Очереди сообщений
- •3.8.3. Семафоры
- •3.8.4. Совместная память
- •3.8.5. Программные каналы
- •3.8.6. Программные гнезда
- •3.9. Контрольные вопросы
- •3.10. Тесты
- •Глава 4. Файловая система unix
- •4.1. Имена файлов
- •4.2. Структура файловой системы
- •4.2.1. Загрузочный блок
- •4.2.2. Суперблок
- •4.2.3 Дескрипторы файлов
- •4.2.4. Блоки данных и свободные блоки
- •4.3. Типы файлов
- •4.3.1. Обычные файлы
- •4.3.2. Каталоги
- •4.3.4. Символические связи
- •4.3.5. Fifo – Именованные каналы
- •4.3.6. Сокеты
- •4.3.7. Обозначение типов файлов
- •Типы файлов
- •4.4. Дескриптор обычного файла
- •4.5. Дескриптор каталога
- •4.6. Дескриптор специального файла
- •4.7. Системная таблица файлов
- •4.8. Монтирование файловых систем
- •4.9. Демонтирование файловых систем
- •4.10. Проверка и восстановление файловых систем
- •4.11. Журналирование файловых систем
- •4.12. Контрольные вопросы
- •4.13. Тесты
- •Глава 5. Этапы начальной загрузки ос Unix
- •5.1. Загрузка и инициализация ядра
- •5.2. Распознавание и конфигурирование устройств
- •5.3. Создание спонтанных процессов
- •5.4. Выполнение команд оператора
- •5.5. Выполнение командных файлов запуска системы
- •5.6. Переход в многопользовательский режим
- •5.7. Контрольные вопросы
- •5.8. Тесты
- •Глава 6. Обзор командных файлов
- •6.1. Процесс init
- •6.1.1. Формат файла inittab
- •6.1.2. Уровни выполнения
- •Уровни выполнения
- •6.1.3. Дисциплины обработки процесса
- •Дисциплины обработки процесса
- •6.1.4. Запуск и этапы работы процесса init
- •6.2. Процесс rc
- •6.2.1. Сценарии запуска системы Solaris
- •6.3. Процесс cron
- •6.4. Процесс регистрации пользователей
- •6.5. Контрольные вопросы
- •6.6. Тесты
- •Глава 7. Останов системы
- •7.1. Выключение питания
- •7.2. Команда shutdown
- •7.3. Команда halt
- •7.4. Изменение уровня выполнения процесса init
- •Глава 8. Задачи системного администрирования
- •8.1. Инструменты администрирования
- •8.1.1. Администрирование aix
- •8.1.2. Администрирование hp-ux
- •8.1.3. Администрирование Solaris
- •8.1.4. Администрирование Linux
- •8.2. Пользователь root
- •8.2.1. Команда su
- •8.3. Добавление новых пользователей в систему
- •8.3.1. Файл /etc/passwd
- •Идентификаторы пользователей
- •8.3.2. Файл /etc/group
- •8.4. Контрольные вопросы
- •8.5. Тесты
- •Литература
- •Содержание
- •Глава 1. История создания ос unix 6
- •Глава 2. Функционирование ос unix 51
- •Глава 3. Процессы 75
- •Глава 4. Файловая система unix 116
- •Акуленок Ирина Николаевна Акуленок Анатолий Васильевич
- •Часть I. Основы операционной системы unix
3.8.1. Сигналы
Сигналы были первыми средствами IPC, т.е. сигналы можно рассматривать как простейшую форму межпроцессорного взаимодействия, при которых нарушается нормальное выполнение процесса. В то же время сигнал означает условие, существующее внутри процесса, которое требует внимания процесса. Главная задача сигнала – сообщить о возникновении проблемы. Иными словами, сигнал – это способ информирования процесса со стороны ядра о происшествии некоторого события. Смысл термина "сигнал" состоит в том, что, сколько бы однотипных событий в системе не произошло, по поводу каждой такой группы событий процессу будет подан ровно один сигнал. Т.е. сигнал означает, что определяемое им событие произошло, но не несет информации о том, сколько именно произошло однотипных событий.
Сигналы могут быть синхронными, когда инициатор сигнала сам процесс, и асинхронными, когда инициатор сигнала – интерактивный пользователь за терминалом. Источником асинхронных сигналов может быть также ядро, когда оно контролирует определенные состояния аппаратуры, рассматриваемые как ошибочные.
Примерами ситуаций для формирования сигнала являются следующие:
окончание процесса–потомка (по причине выполнения системного вызова exit или системного вызова signal с параметром "death of child (смерть потомка)";
возникновение исключительной ситуации в поведении процесса (выход за допустимые границы виртуальной памяти, попытка записи в область виртуальной памяти, которая доступна только для чтения и т.д.);
превышение верхнего предела системных ресурсов;
оповещение об ошибках в системных вызовах (несуществующий системный вызов, ошибки в параметрах системного вызова, несоответствие системного вызова текущему состоянию процесса и т.д.);
сигналы, посылаемые другим процессом в пользовательском режиме;
сигналы, поступающие вследствие нажатия пользователем определенных клавишей на клавиатуре терминала, связанного с процессом (например, Ctrl+C или Ctrl+D);
сигналы, служащие для трассировки процесса.
Процессы могут взаимодействовать между собой, посылая друг другу сигналы. Сигналы посылаются процессу с помощью команды kill или системного вызова kill(). С помощью системного вызова kill() процесс может послать сигнал, как самому себе, так и другому процессу или группе процессов. В этом случае процесс, посылающий сигнал, должен иметь те же реальный и эффективный идентификаторы, что и процесс, которому сигнал отправляется. Разумеется, данное ограничение не распространяется на процессы, обладающие привилегиями суперпользователя. Такие процессы имеют возможность отправлять сигналы любым процессам системы.
В разных UNIX может быть разное количество сигналов, стандарт POSIX 1.1 определяет тридцать один сигнал. Каждый из них имеет свое мнемоническое обозначение и номер. В разных системах мнемонические обозначения остаются одинаковыми, а номер может быть разным.
Каждый сигнал имеет уникальный номер, однозначно определяющий событие, которым он вызван. Классические версии OS UNIX определяли 16 сигналов с номерами от 1 до 16. Например, список сигналов в Solaris ограничен сорока двумя сигналами.
Для удобства спецификации сигналов используются символьные мнемоники. При этом их цифровое значение с использованием мнемонической формы записи хранится в файле <signal.h>.
Ниже перечислены мнемоники основных сигналов, с кратким описанием событий, инициирующих их появление.
SIGHUP (1) – это сигнал сообщения «о зависании». Сигнал посылается лидеру сеанса, связанному с управляющим терминалом, когда ядро обнаруживает, что терминал отсоединился (потеря линии). Сигнал также посылается всем процессам текущей группы при завершении выполнения лидера.
SIGINT (2) – это сигнал прерывания, который обычно посылается ядром всем процессам текущей группы при нажатии клавиатурной комбинации <Ctrl+C> или клавиши прерывания <DEl>.
SIGQUIT (3) – сигнал выхода, генерируется при нажатии клавиатурной комбинации <Ctrl+\>.
SIGKILL (9) – сигнал безусловного завершения процесса, который является не улавливаемым сигналом, т.е. этот сигнал нельзя ни перехватить, ни игнорировать. Он немедленно завершает выполнение процесса, который не может выполнить операции по очистке. (В руководстве он описан как сигнал «окончания с особым ущербом»).
SIGTERM (15) – представляет собой сигнал условного завершения и является еще одним средством для программы запросить завершения. Сигнал представляет своего рода предупреждение, что процесс вскоре будет уничтожен. Этот сигнал позволяет процессу удалить временные файлы, завершить необходимые транзакции и т.д. Команда kill по умолчанию посылает именно этот сигнал.
SIGSTOP (23) – приостановка выполнения процесса.
SIGCONT (24) – возобновление выполнения приостановленного процесса.
Процесс может выбрать одно из трех возможных действий при получении сигнала:
Он может игнорировать сигнал. Не следует игнорировать сигналы, вызванные аппаратной частью, например, при и делении на 0 или ссылке не недопустимые области памяти, так как дальнейшие результаты в отношении данного процесса непредсказуемы.
Процесс может потребовать действия по умолчанию. Как ни печально, обычно это сводится к завершению выполнения процесса.
Наконец, процесс может перехватить сигнал и самостоятельно обработать его. Например, перехват сигнала SIGINT позволит процессу удалить созданные им временные файлы, короче, достойно подготовиться к "смерти". Следует иметь в виду, что сигналы SIGKILL и SIGSTOP нельзя ни перехватить, ни игнорировать.
В табл. 3.1 приведен список сигналов, определенный стандартом POSIX 1.1
Таблица 3.1.