- •Операционные системы для программиста
- •Введение
- •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. Командные файлы и сценарии
- •Библиографический список
4.2. Многократный вывод символов и атрибутов
В современных ОС имеются специальные функции для многократного вывода однотипной информации, иногда облегчающие программисту его работу. Рассмотрим вначале средства многократного вывода одного символа. В OS/2 содержатся две системных функции, выполняющих эту задачу. Одна из них позволяет задавать символ вместе с атрибутом для вывода и называется VioWrtNCell. Другая не содержит информации об атрибуте выводимого символа и называется VioWrtNChar. Для обеих, если при их выполнении достигается конец экрана, вывод прекращается.
Функция VioWrtNCell имеет на языке Си прототип
APIRET16 VioWrtNCell(BYTE *pCell, USHORT len,
USHORT row, USHORT col, HVIO hvio),
где row – номер строки, а col – номер колонки позиции экрана, с которой начинается вывод (в случае одного символа – куда осуществляется вывод); len – число повторений вывода символа (сколько раз подряд заданный символ будет выводиться на экран); pCell – адрес ячейки из двух байтов, задающий информацию о символе для вывода, причем младший байт должен содержат ASCII код символа, а старший байт – атрибуты вывода.
Функция VioWrtNChar имеет на языке Си прототип
APIRET16 VioWrtNChar(BYTE *pChar, USHORT len,
USHORT row, USHORT col, HVIO hvio),
где row – номер строки, а col – номер колонки позиции экрана, с которой начинается вывод (в случае одного символа – кѓда осуществляется вывод), |en – число повторений вывода символа (сколько раз подряд заданный символ будет выводитьсџ0на экран), pChar - адрес байта, хранящего символ.
Дополнением к возможностям только что рассмотренных функций служит функция VioWrtNAttr. Она позволяет предварительно установить новые атрибуты для текста или изменить старые атрибуты уже выведенного текста для последовательных позиций экрана. Место экрана, начиная с которого следует изменить атрибуты, указывается в вызове функции VioWrtNAttr.
Функция VioWrtNAttr имеет на языке Си прототип
APIRET16 VioWrtNAttr(BYTE *pAttr, USHORT len,
USHORT row, USHORT col, HVIO hvio),
где row – номер строки, а col – номер колонки позиции экрана, с которой задаются (изменяются) атрибуты, len – число мест для символов, в которых изменяются атрибуты, pAtrr – адрес байта, хранящего атрибут.
Для многократного вывода одного символа в Windows предназначена функция FillConsoleOutputCharacter, а для многократного вывода одного и того же атрибута – функция FillConsoleOutputAttribute. Эти функции имеют прототипы
BOOL FillConsoleOutputCharacter(HANDLE hConsOut,
CHAR character, WORD len, COORD pos, DWORD* actlen);
BOOL FillConsoleOutputAttribute(HANDLE hConsOut,
WORD attr, DWORD len, COORD pos, DWORD* actlen).
Первые аргументы этих функций задают хэндл экрана консоли (более точно экранного буфера), вторые соответственно – выводимый символ или выводимый атрибут, параметр len задает число повторений вывода этого символа или атрибута, а параметр actlen – адрес для возврата числа действительно выполненного числа повторений. Это число может отличаться от заказанного в вызове системной функции, если в процессе вывода достигнут конец экрана. Параметр pos задает позицию экрана, начиная с которой эти функции выполняют свой вывод.
Для задания атрибутов в Windows можно использовать предопределенные символические константы, которые заданы в заголовочном файле wincon.h. Эти константы имеют названия FOREGROUND_BLUE, FOREGROUND_GREEN, FOREGROUND_RED, FOREGROUND_INTENSITY, BACKGROUND_BLUE, BACKGROUND_GREEN, BACKGROUND_RED, BACKGROUND_INTENSITY, которые говорят сами за себя. Для получения комбинированного цвета с их помощью достаточно несколько требуемых из них соединить символами побитовой операции ИЛИ. Так, например, для задания белового цвета символа следует указать операнд в виде FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE. (Нетрудно видеть, что этот подход достаточно громоздкий для нормального программиста, поэтому неплохо представлять, что значения перечисленных выше констант есть соответственно 1, 2, 4, 8, 16, 32, 64 и 128.)
В Windows имеется еще одна возможность установки цвета для вывода на экран консоли. Ее предоставляет функция с прототипом
BOOL SetConsoleTextAttribute(HANDLE houtput, WORD attrib).
Эта функция устанавливает цвет, автоматически используемый далее при выводе на экран функцией WriteFile (и также более специализированной функцией WriteConsole), а так жеиспользуемый при отображении символов в процессе ввода функцией ReadFile. Кроме того, такая установка оказывается действующей и на те функции, которые в действительности построены на основе указанных. В то же время эта установка не действует на некоторые другие функции вывода, которые будут рассматриваться далее. (В частности на вывод в произвольную позицию экрана с помощью функции WriteConsoleOutput.)
В операционной системе Unix отсутствуют системные функции многократного вывода символов и атрибутов. Желающие, впрочем, легко могут написать их для себя, опираясь на стандартные средства этой операционной системы.
Для современного программирования непременной особенностью является широкое использование цветовых возможностей мониторов. Достаточно скромные средства для этого в Unix связана с тем, что эта ОС становилась и внутренне развивалась в более ранний период, когда наличие цветного монитора было редкой особенностью.
Проблема использования цвета в Unix была решена с помощью управляющих последовательностей. Для задания цвета используются управляющие последовательности, последним символом которых служит латинская буква m. Сама управляющая последовательность имеет вид
esc[цветm
где компонент цвет задается десятичным числом согласно табл. 4.1.
Табл. 4.1.Кодирование цвета в управляющих последовательностях
Цвет |
Описание |
0 |
Отменить все атрибуты |
1 |
Повышенная яркость |
30 |
Черный символ |
31 |
Красный символ |
32 |
Зеленый символ |
33 |
Желтый символ |
34 |
Голубой символ |
35 |
Малиновый символ |
36 |
Бирюзовый символ |
37 |
Белый символ |
40 |
Черный фон |
41 |
Красный фон |
42 |
Зеленый фон |
43 |
Желтый фон |
44 |
Голубой фон |
45 |
Малиновый фон |
46 |
Бирюзовый фон |
47 |
Белый фон |
Цвет символа, фона и, может быть, повышенной яркости можно задавать в одной управляющей последовательности, разделяя их символами "точка с запятой" и обязательно без дополнительных разделяющих пробелов. Например задание ярко-желтого символа на синем фоне, можно получить управляющей последовательностью
esc[1;33;44m
Цвет, установленный управляющей последовательностью, действует до тех пор, пока другой подобной последовательностью он не будет переустановлен. В частности, после завершения работы программы очень удобно вернуться к стандартному цвету использования консоли: светло-серым символам на черном фоне. Для такого перехода проще всего выполнить управляющую последовательность esc[0m .
Заметим, что параметры 30-47 соответствуют стандарту 6429 Международной организации по стандартизации (ISO). Нетрудно видеть, что средства Unix обеспечивают достаточно компактные средства управления цветом, но, к сожалению, для начинающих очень не наглядные.
