Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:OC Windows & OC Linux. Лабораторные работы по курсу «Операционные системы»
.pdf
РОССИЙСКИЙ НОВЫЙ УНИВЕРСИТЕТ
___________________________________________________________
Д.Э. ФЕДОТОВА
ОС WINDOWS
&
ОС LINUX
Лабораторные работы
по курсу «Операционные системы»
Москва
2009

УДК 681.3.06
ББК 32.973
Ф 34
Рецензенты:
Кандидат технических наук, доцент кафедры математическое
обеспечение вычислительных систем МИРЭА В.К. Григорьев
Зам. заведующего кафедрой информационная безопасность
РосНОУ, д.т.н., профессор Б.И. Скородумов
Федотова Д.Э.
Ф34 OC Windows & OC Linux: Лабораторные работы по курсу
«Операционные системы». – М.: РосНОУ, 2009. – 224 с.
В данном пособии рассмотрены две популярные на сегодняшний день опе-
рационные системы – OC Windows и OC Linux.
Если в OC Windows механизмы ядра «скрыты» разработчиком, то в OC
Linux их можно подробно изучить – это системные вызовы ввода-вывода PiPe
и FIFO, семафоры и нити.
Рекомендовано студентам, изучающим курс операционные системы, будет
полезно преподавателям и аспирантам.
УДК 681.3.06
ББК 32.973
© Д.Э. Федотова, 2009
© РосНОУ, 2009
2

ОС WINDOWS
ЧАСТЬ 1
3

ЛАБОРАТОРНАЯ РАБОТА № 1
СТРУКТУРА ПРИЛОЖЕНИЙ MS WINDOWS
Цель работы: познакомить студентов с процессом создания и
структурой приложений Windows.
Назначение работы: дать студентам возможность освоить на
практике методику создания прикладных программ под ОС
Windows, которыми необходимо овладеть для успешного изучения
операционной системы, и познакомить с принципами их построения.
ОПИСАНИЕ РАБОТЫ
MS Windows является многозадачной операционной системой с
графическим интерфейсом. В отличие от программ для MS-DOS,
приложения Windows не имеют доступа к ресурсам системы напрямую. Общение с внешней средой происходит через WinAPl – прикладной программный интерфейс. Система сама определяет, в какой
момент времени какой задаче предоставить данный ресурс.
Оконный интерфейс – средство разделения экрана между задачами. Для того чтобы вывести какую-либо информацию, программа
должна сначала создать окно, которое станет ее рабочей областью.
Другое отличие программ, создаваемых под Windows, заключается в том, что теперь они узнают о всех внешних событиях из сообщений, получаемых от системы. Сообщение – это структура данных определенного формата, которая записывается в очередь сообщений приложения. Туда оно попадает из общей системной очереди.
typedef struct tagMSG
{ HWND hwnd; // Идентификатор окна;
UINT message; // Номер сообщения;
WPARAM wParam; // Дополнительные сведения о сообщении,
LPARAM lParam; // зависят от сообщения;
DWORD time; // Время посылки сообщения;
POINT рt; // Позиция курсора во время посылки сооб-
щения
} MSG;
Основной цикл выборки сообщений обычно размещается в главной функции программы. Для программ, написанных на языке Си,
4

она называется WinMain и с нее начинается выполнение. Ее вид в
общем следующий:
int PASCAL WinMain{HINSTANCE hinstCurrent, HINSTANCE
hinstPrevious,
LPSTR ipszCmdLine, int nCmdShow);
{
//инициализирующие действия
. . . . . . . .
MSG msg;
while (GetMessage (&msg, 0,0,0) )
{
DispatchMessage (&msg);
}
//завершающие действия
. . . . . .
return 0;
}
Через параметр hinstCurrent передается идентификатор текущей
копии исполняемою модуля. hinstPrevious содержит значение, принадлежащее предыдущей запущенной копии. IpszCmdLine – это указатель на строку параметров командной строки, nCmdShow – предписание системы о том, в каком виде должно быть выведено на экран главное окно приложения (свернуто, развернуто и т.п.).
После инициализации программа входит в цикл выборки сообщений, который продолжается до самого завершения ее работы.
Функция GetMessage выбирает следующее сообщение из очереди и
помещает его описание в структуру типа MSG. Для всех сообщений,
кроме WM_QUIT, она возвращает ненулевое значение. Это сообщение посылается процедурой главного окна при его закрытии, после
которого программа должна прекращать выполнение. После того
как сообщение извлечено из очереди, оно должно быть направлено
процедуре того окна, которому оно было послано. Функция DispatchMessage отвечает за распределение сообщений между окнами
приложения.
Исходный текст приложения Windows состоит, по крайней мере, из двух файлов. В одном находится код программы (с расширением .с или .срр для языка Си), в другом (с расширением .clef) – опи-
5

сание параметров создаваемого исполняемого модуля. Рассмотрим
вид простейшего приложения, выводящего на экран сообщение.
//файл 01_1.срр
#include<windows.h>
#pragma argsused
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE
hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
MessageBox(NULL,"Пример №1","Лабораторная работа № 1",MB_OK);
return 0;
}
//файл 01_l.def
NAME PROG01_1
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 1024
EXPORTS
; ===List your explicitly exported functions
here===
Эта программа не создает ни одного окна и не реализует собственного цикла обработки сообщений, используя цикл стандартного
модульного диалогового окна для вывода информационных сообщений MessageBox. Первая строка включает заголовочный файл windows.h, содержащий объявление большинства функций WinAPI.
Функция MessageBox показывает на экране окошко с кнопкой «ОК»
и заданными значком, текстом и заголовком. Она имеет следующий
прототип:
int MessageBox(hwndParent, lpszText, lpszTitle, fuStyle)HWND hwndParent; //родительское окно LPCSTR
lpszText;
//выводимый текст
LPCSTR lpszTitle; //заголовок окна UINT
fuStyle;
//стили окна сообщений
6

Значение параметра fuStyle определяется комбинацией констант, которые, в том числе, определяют, какие кнопки и какой значок будут у окна. Например, МВ_ОК задает одну кнопку «OK»,
MB_YESNO – две кнопки «Да» и «Нет», MB_ICONSTOP – значок
«Стоп», MB_ICONQUESTION – значок «Вопросительный знак».
Функция возвращает константу, соответствующую нажатой кнопке:
IDYES означает кнопку «Да», IDОК – «Нет», и т.д.
Файл (.def) определения модуля предоставляет компоновщику
информацию об экспортируемых функциях, атрибутах и другой информации о создаваемой программе. Он состоит из нескольких
строк, содержащих команды. В таблице ниже приводится описание
некоторых из них.
CODE
[FIXED|MOVEABLE]
[DISCARDABLE|NONDIS
CARDABLE]
[PRELOAD|LOADONCALL]
DATA
[NONE|SINGLE|MULTIPLE]
[FIXED|MOVEABLE]
DESCRIPTION "text"
Задает атрибуты сегмента кода,
где FIXED означает, что сегмент
будет фиксирован в памяти,
MOVEABLE будет перемещаемым, DISCARDABLE – сегмент
может быть сброшен, NONDISCARDABLE – сегмент не может
сбрасываться, PRELOAD – сегмент загружается в память при загрузке программы, LOADONCALL
– только в случае необходимости.
Задает атрибуты сегмента данных. NONE означает, что сегмент
данных отсутствует, SINGLE – что
для всех экземпляров программы
загружается только один сегмент,
MULTIPLE – что все экземпляры
имеют собственные сегменты данных.
Позволяет помещать текстовое
описание в файл модуля программы.
7

EXETYPE
[WINDOWS|OS2|DOS4]
EXPORTS Имя [@Номер]
HEAPSIZE Размер
IMPORTS Имя_для_обращения = Имя_модуля. Номер_или
_имя_функции
LIBRARY Название
STACKSIZE
STUB "Программа"
Тип системы, для которой создается программа.
Используется для описания имен и
атрибутов экспортируемых функций. «Имя» – имя функции, «Номер» – номер функции, назначаемый ей.
Определяет размер локальной
динамической памяти (до 64 Кб).
Задает имена и атрибуты функций, импортируемых из динамически загружаемых библиотек. Имя
для обращения – это имя, которое
будет носить эта функция в программе. Имя модуля – это название
файла библиотеки. Номер или имя
функции – это название или номер
функции в библиотеке.
Задает имя создаваемой динамически подключаемой библиотеки.
Должно совпадать с именем файла
модуля.
Размер стека в байтах.
Указывает на ЕХЕ-программу, которая будет помещена в создаваемый исполняемый модуль и будет
запускаться из-под MS-DOS.
Следующий более сложный пример иллюстрирует механизм
создания окон и обработки поступающих в него сообщений.
//файл 01_2.ерр
#include<windows.h>
//прототип процедуры окна
8

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam);
//название для класса окна
char szClassName[]="05162738 49";
//название окна
char szWindowName[]="Лабораторная работа №1.
Пример №2.";
//идентификатор главного окна
HWND hMainWnd=NULL;
//главная функция программы
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE
hPrevInst,
LPSTR ipszCmdLine, int nCmdShow);
{
//создадим класс окна
WNDCLASS wc;
we.style=0;//стиль класса окна
we.lpfnWndProc=WindowProc; //процедура окна
we.cbClsExtra=O; //размер дополни-
тельной памяти для класса
wc.cbWndExtra-O; //размер дополни-
тельной памяти для окон
we.hInstance-hlnst; //идентификатор
программы, кото-
рой принадлежит класс
we.hIcon =LoadIcon (hInst,IDI_APPLICATION);
//стандартная пиктограмма
we.hCursor=LoadCursor(hInst,IDC_ARROW);
//стандартный курсор
wc.hbrBackground =COLOR_WIN-DOW+l;
//стандартный цвет для фона окна
we.lpszMenuNarae=NULL; //меню нет
wc.lpszClassName=szClassName;
//имя класса окна
//зарегистрируем класс окна
if(!RegisterClass(&wc)){
//если ошибка, выведем сообщение
MessageBox(NULL,"Ошибка регистрации класса окна.",
"Сообщение",МВ_ОК|MB_ICONSTOP);
9

return -1;
}
//создадим окно
hMainWnd=CreateWindow(szClassName,
//имя класса окна
szWindowName,
//название окна
WS_OVERLAPPEDWINDOW,
//перекрывающееся окно
CW_USEDEFAULT,CW_USEDEFAULT,
//положение по умолчанию
CW_USEDEFAULT,CW_USEDEFAULT,
//размеры по умолчанию
HWND DESKTOP,
//родительское окно – рабочий стол
NULL,
//меню нет
hInst,
//идентификатор программы-владельца окна
NULL);
//параметров нет
if(hMainWnd==NULL)
{
//если ошибка, выведем сообщение
MessageBox (NULL', "Ошибка регистрации класса ок-
на.",
"Сообщение",МВ_ОК|MB_ICONSTOP);
return -1;
}
//покажем окно на экране
ShowWindow(hMainWnd,SW_SHOW);
//обновим его содержимое
UpdateWindow(hMainWnd);
//цикл обработки сообщений
MSG msg;
while(GetMessage(&msg,0,0,0) )
{
DispatchMessage{&msg);
}
10
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
