
- •Операционные системы для программиста
- •Введение
- •1. Основные понятия
- •1.1. Понятие операционной системы
- •1.2. Системные соглашения для доступа к функциям ос
- •1.3. Особенности разработки программ в базовых ос
- •1.4. Командный интерфейс пользователя в ос
- •1.5. Информация об ошибках системной функции
- •2. Программный доступ к файловой системе
- •2.1. Понятия дескрипторов, идентификаторов и хэндлов
- •2.2. Ввод и вывод в стандартные файлы.
- •2.3. Базовые средства использования файлов
- •2.4. Многопользовательская блокировка файлов
- •2.5. Установка произвольной позиции в файле
- •3. Принципы построения ос
- •3.1. Модульная структура построения ос
- •3.2. Использование прерываний в ос
- •3.3. Управление системными ресурсами
- •3.4 Строение ядра операционной системы
- •3.5. Структура операционной системы типа Windows nt
- •4. Многофункциональный консольный вывод
- •4.1. Функции управления курсором
- •4.2. Многократный вывод символов и атрибутов
- •4.3. Вывод в произвольную позицию экрана
- •4.4. Ввод данных, размещенных предварительно на экране
- •5. Системные функции ввода для консольных устройств
- •5.1. Системные функции ввода текстовых строк
- •5.2. Событийно-управляемый ввод
- •5.3. Системные функции ввода с клавиатуры
- •5.4. Опрос ввода с клавиатуры в программе
- •5.5. Системные функции мыши для текстового режима
- •6. Файловые системы
- •6.1. Структуры файловых систем для пользователя
- •6.2. Методы распределения внешней памяти
- •6.3. Принципы построения файловых систем типа fat
- •6.4. Современные модификации файловой системы fat
- •6.5. Особенности построения файловой системы hpfs
- •6.6. Принципы построения файловой системы ntfs
- •6.7. Особенности строения файловых систем для Unix
- •6.8. Программный опрос файловой системы
- •7. Обеспечение множественности процессов
- •7.1. Основные понятия теории вычислительных процессов
- •7.2. Программное порождение процессов
- •7.3. Уничтожение процессов
- •7.4. Ожидание завершения процессов
- •8. Многопоточное функционирование ос
- •8.1. Понятие нити и связь Хе с процессом
- •8.2. Создание нитей (thread) в программе
- •8.3. Уничтожение нитей
- •8.4. Приостановка и повторный запуск нити
- •8.5. Ожидание завершения нити
- •9. Средства взаимодействия программных единиц
- •9.1. Абстрактные критические секции
- •9.2. Абстрактные семафоры
- •9.3. Семафоры взаимоисключения
- •9.4. Семафоры событий
- •9.5. Средства группового ожидания
- •9.6. Программные критические секции
- •9.7. Программные семафоры с внутренним счетчиком
- •10. Управление памятью
- •10.1. Виртуальная память
- •10.2. ЏодкРчка страниц для реализациШ виртуальной памяти
- •10.3. Системные функции распределения памяти
- •10.4. Совместное использование памяти
- •10.5. Отображение файлов в оперативную память
- •10.6. Динамически распределяемая память
- •11. Средства коммуникации процессов
- •11.1. Неименованные коммуникационные каналы Unix
- •11.2. Переназначение хэндлов для доступа к каналу
- •11.3. Неименованные каналы в Windows
- •11.4. Именованные каналы в Windows nt
- •11.5. Именованные каналы в Unix
- •12. Взаимодействие пользователя с ос
- •12.1. Интерфейсы операционных систем
- •12.2. Командные и операционные оболочки (shells)
- •12.3. Основные команды базовых операционных систем
- •12.4. Групповое выполнение и фоновый запуск команд
- •12.5. Стандартный ввод-вывод и конвейеры командной строки
- •12.6. Командные файлы и сценарии
- •Библиографический список
12.2. Командные и операционные оболочки (shells)
Как правило, все современные операционные системы имеют внутренний набор текстовых команд, которые позволяют раздельно задавать отдельные действия в операционной системы. Эти команды относятся к средствам управления сеансом командной строки (термин MS Windows) или просто к командам командной строки (термин Unix).
Указанные команды позволяют выполнять действия над объектами операционной системы. С точки абстрактной теории, именно в этих командах сосредоточены наиболее общие абстракции объектно-ориентированного программирования, причем применительно к самой операционной системе. Заметим, что обычные языки программирования имеют дело преимущественно с информационными объектами, гораздо более примитивными по своему строению.
Основными объектами манипулирования посредством командной строки являются файлы, процессы, потоки информации и взаимодействия. Причем файлы рассматриваются как неделимые объекты, а не как совокупности байтов, требующих обработки.
Основные действия, задаваемые в командной строке, следующие: запуск процесса по задаваемой программе, манипуляции с файлами (копирование, переименование, создание нового файла, создание каталога и переход в него как в текущий), изменение текущих свойств перечисленных выше объектов операционной системы. Последние действия включают изменение атрибутов и прав доступа файлов, изменение характера выполнения вычислительного процесса (изменение приоритета, перевод его в фоновый режим или передний план), изменение характеристик работы консоли и множества других. (Опять же, как видим, для этих действий нет аналогов в обычном программировании.)
С учетом важности выполнения перечисленных команд для полноценного функционирования операционной системы под управлением опытного администратора, созданы вспомогательные программные средства – командные оболочки, называемые (по традиции Unix) shell. Эти командные оболочки позволяют, кроме приема и запуска собственно команд ОС, использовать специальные командные тексты – сценарии команд, называемые также сценариями shell или командными файлами. Практически эти сценарии есть текстовые файлы, содержащие последовательности команд, и, может быть, – вспомогательные средства организации таких команд для их повторений или условного выполнения. По существу, сценарии команд представляют собой специализированные программы, написанные на языке сценариев для конкретной командной оболочки.
Командные оболочки, с точки зрения программиста, представляют собой интерпретаторы команд. Иначе говоря, они выполняют команду непосредственно после ее ввода с клавиатуры или по очереди записи в командном файле.
В старой операционной системе MS DOS, вызываемой обычно из-под ОС типа Windows 9x, выполнение отдельных команд и командных файлов обеспечивается командным интерпретатором COMMAND.COM. Это же наименование имеет командный интерпретатор и в ОС типа Windows 9x. В операционных системах OS/2 и Windows NT командный интерпретатор называется CMD.EXE.
В операционных системах типа Unix – наиболее широкое семейство командных интерпретаторов (shells). Это традиционный и наиболее широко используемый интерпретатор bash (Bourn Again Shell), модификации командного интерпретатора С-Shell, приближенного к возможностям языка С, и иногда ряд других, но частично похожих на упомянутые. В применении к Linux будем рассматривать два его основных командных интерпретатора – bash и tcsh. Первый из них представляет в Linux расширенный типовой интерпретатор Bourn'а, а второй усовершенствованную разновидность С-Shell.
Заметим, что современные командные интерпретаторы не ограничиваются базовыми или типовыми интерпретаторами для конкретной ОС. В последнее время резко возрос интерес к универсальным командным интерпретаторам, позволяющим управлять операционной системой. К ним отчасти можно отнести интерпретаторы языка JavaScript и, главное, одну из последних очень эффективных новинок – интерпретаторы языка Tcl/Tk (Tool Command Language/Tool Kit). В современной терминологии все командные интерпретаторы и подобные им программные системы относятся к классу интерпретаторов языков сценариев или script-языков. Язык Tcl/Tk называют языком системной интеграции. Он был создан вначале для ОС типа Unix и особенно для поддержки в режиме интерпретации графической оболочки X Window этих ОС. К настоящему времени Tcl/Tk реализован интерпретаторами для Windows 3.1/9x/NT, Macintosh, AIX, QNX, VMS и OS/2.
В заключение следует подчеркнуть, что базовые командные интерпретаторы ОС фирмы Microsoft очень бедны инструментальными средствами и по своим возможностям только едва-едва подтягиваются к "мощности" интерпретируемого языка Basic.