Similar presentations:
Организация ввода-вывода в современных ОС
1. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА В СОВРЕМЕННЫХ ОС
2. Общие принципы организации ввода-вывода
Система ввода-вывода ПК3. Механизм управления вводом-выводом
Механизм управления вводомвыводом4. Общие принципы размещения данных на магнитных дисках
Структура хранения информации на жестком диске5. Упрощенная структура MBR
6.
наиболее известные идентификаторы7. Формат элемента таблицы разделов
8.
9. Организация файлового ввода-вывода в ОС Windows API-функции для организации ввода-вывода
Организация файлового вводавывода в ОС WindowsAPI-функции для организации
ввода-вывода
HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess, DWORD
dwShareMode, LPSECURITY_ATTRIBUTES
lpSecurityAttributes, DWORD
dwCreationDispostion, DWORD
dwFlagsAndAttributes, HANDLE hTemplateFile);
10.
11. Комбинации флагов
12.
BOOL ReadFile( HANDLE hFile;// дескриптор файла
LPVOID lpBuffer;
// буфер для временного хранения
// прочитанных данных
DWORD dwBytesToRead;
// количество байтов, которые
// должны быть прочитаны LPDWORD
lpdwBytesRead;
// возвращает количество
// прочитанных байтов
LPOVERLAPPED lpOverlapped ); // поддержка асинхронного
// ввода/вывода
BOOL WriteFile( HANDLE hFile, // дескриптор файла
CONST VOID *lpBuffer,
//указывает данные, которые
// должны быть записаны в файл
DWORD dwBytesToWrite,
// количество записываемых байтов
LPDWORD lpdwBytesWritten,
// возвращает количество
// записанных байтов
LPOVERLAPPED lpOverlapped ); // задает поддержку
// асинхронного ввода/вывода
13.
Чтобы закрыть файл, используется функцияCloseHandle(). Эту функцию можно
использовать не только для закрытия
дескрипторов файлов. С ее помощью можно
закрыть любой другой дескриптор. BOOL
CloseHandle( HANDLE hObject);
14.
#include <windows.h>void MB(char *s) // Для удобства использования MessageBox
{ MessageBox(NULL, s, NULL, MB_OK | MB_ICONSTOP);
}
void docat(char *fname) // основная подпрограмма
{
HANDLE f=CreateFile ( fname, GENERIC_READ, 0, NULL,
OPEN_EXISTING, 0, NULL);
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
if (f==INVALID_HANDLE_VALUE)
{
MB("He могу открыть файл");
exit(1);
}
char buf[4096];
unsigned long n;
15.
do { unsigned long wct;if (!ReadFi1e(f, buf, sizeof(buf), &n, NULL))
break;
if (n)
WriteFile(out, buf, n, &wct, NULL);
}
while (n==sizeof(buf)); // Если EOF, это условие не выполняется CloseHandle(f);
}
void main(int argc, char *argv[])
{
if (argc==1)
{
// утилита cat - Ошибки фактически не обрабатываются
// Любая ошибка вызывает аварийное завершение программы MB("Usage:
cat FILENAME [FILENAME ....]"); exit(9);
}
// Обработать все указанные файлы
while (--argc) docat(*++argv);
exit(0);
}
16. Механизмы асинхронного ввода-вывода
Механизмы асинхронного вводавыводаBOOL GetOverlappedResult( HANDLE hFile, // дескриптор
// файла или устройства
LPOVERLAPPED lpOverlapped, // поддержка асинхронного
// ввода/вывода
LPDWORD lpNumberOfBytesTransferred, // количество
// переданных байт
BOOL bWait );
// флаг ожидания
Чтобы прервать выполнение операции ввода/вывода, следует
использовать функцию CanselIo.
BOOL CancelIo( HANDLE hFile);
// дескриптор файла
17.
BOOL ReadFileEx( HANDLE hFile,LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPOVERLAPPED lpOverlapped,
POVERLAPPED_COMPLETION_ROUTINE
lpCompletionRoutine );
BOOL WriteFileEx( HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE
lpCompletionRoutine );
18. Порты завершения ввода/вывода
HANDLE CreateIoCompletionPort(HANDLE FileHandle,
// дескриптор файла HANDLE
ExistingCompletionPort,
// дескриптор создаваемого
// (или открываемого) порта завершения
ULONG_PTR CompletionKey,
// ключ завершения,
// вставляемый в каждый пакет
DWORD NumberOfConcurrentThreads ); //количество
// подключаемых потоков
19.
BOOL GetQueuedCompletionStatus(HANDLE CompletionPort,
//дескриптор порта
LPDWORD lpNumberOfBytes, // количество переданных байт
PULONG_PTR lpCompletionKey, //указатель на ключ
// завершения, (если он объявлен ранее)
LPOVERLAPPED *lpOverlapped, //указатель на Overlapped
DWORD dwMilliseconds ); // время ожидания пакета
20.
PostQueuedCompletionStatus( HANDLECompletionPort, DWORD
dwNumberOfBytesTransferred, ULONG_PTR
dwCompletionKey, LPOVERLAPPED
lpOverlapped );
21. Информация об ошибках системной функции Windows
Наиболее экзотической является получение информацииоб ошибках в MS Windows. Во первых, отсутствует
какое-либо подобие систематичности в системных
функциях. Возвращаемые значения системных функций
могут быть описаны как VOID, BOOL, HANDLE,
PVOID, LONG или DWORD.
Функция GetLastError() возвращает последнюю ошибку,
возникшую в ходе выполнения программы (точнее нити
программы). Именно это 32-битное значение дает код
ошибки. Собственно коды ошибок, общие для всех
системных функций, содержатся в заголовочном файле
WinError.h.
22. Текстовая информация об ошибке в Windows
Числовые коды ошибок, возвращаемые функциейGetLastError(), достаточно сложно для разработчика
соотнести с наименованием ошибки. Если требуется
распознавание вида ошибки при автоматическом выполнении
программы, то разработчики этой ОС предлагают для
использования специальную функцию FormatMessage.
FormatMessage(DWORD dwFlags, LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPTSTR lpBuffer, DWORD nSize, va_list *Arguments).
23. Простейшее использование FormatMessage
len=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL, k, // k - номер ошибки от GetLastError()
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
txtmess, sizeof(txtmess), NULL);
где имя txtmess определено предварительно в описании
вида char txtmess[300]. Возвращаемое функцией
значение дает число символов в тексте, сформированном
ею в заданном буфере.
Возвращает порядка тысячи различных наименований
ошибок на языке текущей локализации.
24. Техническая проблема использования для русского языка
Существенной особенностью рассматриваемой функцииоказывается использование возвращаемых текстов
сообщений об ошибках, представленных в кодировке для
графического режима. Исторически сложилось так, что
тексты, записанные не с помощью латинского алфавита,
имеют различное представления в графическом и
текстовом режиме.
Решение возникающих при этом проблем обеспечивается
парой функций преобразования из одной формы
представления в другую.
BOOL CharToOem(char *textsource, char *textresult),
BOOL OemToChar(char *textsource, char *textresult).
25. Особенности наименования функции перекодировки
Разработчики условным буквосочетанием Char в названиифункций обозначают кодировку графического режима, а
обозначением Oem в названии – кодировку текстового
режима. Таким образом функция CharToOem задает
преобразование текста из кодировки графического
режима Windows в текстовый режим, а функция
OemToChar – преобразование текста из кодировки
текстового режима в графический режим.
26.
МНОГОФУНКЦИОНАЛЬНЫЙКОНСОЛЬНЫЙ ВЫВОД
Классические языки высокого уровня не содержат средств
управления позицией вывода на экране и цветом
символов текста. Когда создавались эти языки, подобные
средства были недоступны по аппаратным причинам.
Глубокая связь упомянутых возможностей с конкретной
аппаратурой привела к тому, что подобные средства
оказались зависимыми от операционной системы.
Сейчас мониторы поддерживают как позиционирование
курсора, так и многоцветные изображения, но
особенности управления этими возможностями попрежнему оказываются зависимыми от операционных
систем.
27. Управление курсором
Большинство программных средств для выводатекста выводят этот текст не просто на экран или
в консольное окно, а в место, указываемое
текстовым курсором (специальным символом
указания на текущее место для вывода). Поэтому
для вывода в место экрана, желаемого на
текущем момент программистом, требует
предварительного перемещения курсора в это
место. Дополнительно могут использоваться
функции вывода с указанием в них же места
вывода (редко).
28. Установка курсора в текстовом режиме
Такое действие должно задаваться чем-то в видефункций_установки(X-позиция, Y-позиция).
В Windows функция задания места курсора внутри
текстового окна:
SetConsoleCursorPosition(HANDLE hConsOut,
COORD pos).
Координаты места должны быть предварительно
помещены в экземпляр структуры типа COORD, в
которой два поля с именами X и Y. Другой аргумент
функции — действующий хэндл стандартного вывода
(обычно). Возвращает значение типа BOOL. Координаты
задают знакоместа (фиксированные позиции для
символов), а не позицию отдельных пикселов.
29. Получение координат курсора
GetConsoleScreenBufferInfo(HANDLE hConsOut,CONSOLE_SCREEN_BUFFER_INFO* pInfo),
где последний аргумент возвращаемый, должен
быть подготовлен как экземпляр структуры и
содержит ряд полей. Главные из них
описываются как
COORD dwSize; COORD dwCursorPosition;
Они возвращают пару значений из ширины и
высоты окна и координаты курсора в нем.
30. Управляющие последовательности как средство управления выводом
В операционных системах Unix и Linux дляуправления курсором и некоторых других
действий с экраном и текстовым окном
предназначены управляющие
последовательности. Идея их использования
расширяет управляющие символы, которые в
языке Си и Unix служат основным средством
управления выводом на экран. Управляющие
последовательности определяются стандартом
ANSI и называются также
ANSI-последовательностями.
31. Запись управляющих последовательностей на языке С
Управляющие последовательности начинаются соспециального символа с десятичным эквивалентом 27.
Этот код на языке Си в составе текстовых констант
записывают в виде '\033'. Здесь использована
универсальная форма записи произвольных (в том числе
явно не изображаемых) символов в виде восьмеричных
констант. Второй символ управляющих
последовательностей - обязательный символ ‘[‘
(открывающаяся квадратная скобка), последним
символом – латинская буква, детализирующая операцию.
Иногда для такой детализации используется и
предпоследний символ.
32. Управляющая последовательность позиционирования курсора
Для установки курсора служит управляющаяпоследовательность, записываемая на языке Си как
текстовая константа
"\033[строка;столбецH"
Здесь компоненты строка и столбец должны быть
обязательно заданы десятичными числами и обязательно
без дополнительных пробелов. Нумерация позиции
считается от 1, так что установка в верхний левый угол
экрана требует последовательности \033[1;1H .
33. Перемещение курсора в разные стороны
Последовательность\033[строкаA
приказывает переместить курсор на заданное в ней число
строк вверх, последовательность
\033[строкаB
– на заданное число строк вниз,
\033c[столбецC
– на заданное в ней число столбцов вправо, а
\033[столбецD
– на заданное число столбцов влево. Если при заданных
значениях параметров курсор должен выйти за пределы
экрана, то действие управляющей последовательности
игнорируется.
34. Получение позиции курсора
Управляющая последовательность\033[6n
выдает информацию о текущей позиции курсора в
в виде текста \033[строка;столбецR
Программа должна считывать этот текст,
задающий позицию курсора, со стандартного
устройства ввода сразу же после записи этой
управляющей последовательности. Что
оказывается не очень удобно для современного
стиля и привычек программирования.
35. Очистка части консольного окна и вывод повторяемых символов
В Windows для очистки окна или его части может бытьиспользован вывод повторяющихся символов, в
частности пробелов.
Для этого служат функции
FillConsoleOutputCharacter(HANDLE hConsOut,
CHAR char, WORD len, COORD pos, DWORD* actlen);
36. Очистка части консольного окна в Linux
Управляющая последовательность\033[2J
очищает экран и перемещает курсор в исходное положение
(строка 0, столбец 0)
Управляющая последовательность
\033[K
удаляет все символы, начиная с позиции курсора до конца
строки (включая символ в позиции курсора).
37. Управление цветом текста в Windows
Задание цвета вывода на «ближайшеебудущее»
(установки цвета для вывода на экран консоли)
SetConsoleTextAttribute(HANDLE houtput, WORD attrib).
Задание цвета использует идею атрибутов. Понятие
атрибутов включает как цвет собственно символов (в
более точных терминах – цвет переднего плана –
foreground), так и цвет фона знакового места для символа
— background. Цвет здесь относиться не собственно к
символу, а к знакоместу. Поэтому может быть
установлен предварительно, одновременно с символом
или изменен в дальнейшем.
38. Кодирование цвета в Windows
Для задания атрибутов в 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.)
39. Предварительное или последующее задание атрибутов
FillConsoleOutputAttribute(HANDLE hConsOut,WORD attr, DWORD len, COORD pos, DWORD*
actlen);
Как бы «раскрашивает» заданными в атрибуте
цветами len знаковых ячейки, начиная с позиции,
задаваемой аргументом pos. Возвращаемое
значение дает информацию, сколько ячеек
удалось раскрасить. Может отличаться от
заданного числа, если указанные ячейки выходят
за пределы консольного окна.
40. Дополнительная возможность: вывод текста с одновременным раскрашиванием
Альтернативой использованияSetConsoleTextAttribute является последовательное
выполнение функций
FillConsoleOutputAttribute и
WriteConsoleOutputCharacter
WriteConsoleOutputCharacter(HANDLE
hConsOut,
CSTR* text, DWORD len, COORD pos,
DWORD* actlen);
41. Установка цвета для последующего вывода в Linux
Используются управляющие последовательности\033[цветm
где компонент цвет задается одним или
несколькими десятичными числами,
разделяемыми символами «точка с запятой» (без
пробелов).
Для кодирования цвета служат значения из
следующей таблицы
42. Таблица атрибутов цвета для управляющей последовательности
Цвета изображения30
Черный
31
Красный
32
Зеленый
33
Желтый
34
Голубой
35
Малиновый
36
Бирюзовый
37
Белый
Цвета фона
40
Черный
41
Красный
42
Зеленый
43
Желтый
44
Голубой
45
Малиновый
46
Бирюзовый
47
Белый
Первая цифра для фона — 4, для символа — 3 , вторая цифра
соответствует десятичному значению трех битов, младший
из которых дает красный цвет, средний — зеленый, а
старший — синий. (Сокращенно BGR — по буквам цветов)
43. Дополнительный атрибут текста
0Отменить все атрибуты
1
Повышенная яркость
2
Пониженная яркость
4
Подчеркивание
7
Негативное изображение
В современных версиях, в частности на Linux, не работают
ранее использовавшиеся атрибуты «Курсив»,
«Мерцание», «Скрытое изображение»
44. Пример управляющей последовательности цвета
Задание ярко-желтого символа на синем фоне,можно получить управляющей
последовательностью
\033[1;33;44m
Например
printf(“\033[1;33;44mPrivet\033[0mVsem”)
выведет слово Privet желтыми буквами на синим
фоне, а слово Vsem будет выводиться далее
белыми буквами на черном фоне.
В Windows управляющие последовательности в
настоящее время не используются!!!
45. Ввод в Windows данных , размещенных предварительно на экране
Основная функцияReadConsoleOutputCharacter(HANDLE hConsOut,
STR* buffer, DWORD len, COORD dwReadCoord,
DWORD* actlen);