Содержание

Слайд 2

Общие принципы организации ввода-вывода

Система ввода-вывода ПК

Общие принципы организации ввода-вывода Система ввода-вывода ПК

Слайд 3

Механизм управления вводом-выводом

Механизм управления вводом-выводом

Слайд 4

Общие принципы размещения данных на магнитных дисках

Структура хранения информации на жестком диске

Общие принципы размещения данных на магнитных дисках Структура хранения информации на жестком диске

Слайд 5

Упрощенная структура MBR

Упрощенная структура MBR

Слайд 6

наиболее известные идентификаторы

наиболее известные идентификаторы

Слайд 7

Формат элемента таблицы разделов

Формат элемента таблицы разделов

Слайд 9

Организация файлового ввода-вывода в ОС Windows API-функции для организации ввода-вывода

HANDLE CreateFile(LPCTSTR lpFileName, DWORD

Организация файлового ввода-вывода в ОС Windows API-функции для организации ввода-вывода HANDLE CreateFile(LPCTSTR
dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDispostion, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);

Слайд 11

Комбинации флагов

Комбинации флагов

Слайд 12

BOOL ReadFile( HANDLE hFile; // дескриптор файла
LPVOID lpBuffer; // буфер для

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(). Эту функцию можно использовать не только

Чтобы закрыть файл, используется функция CloseHandle(). Эту функцию можно использовать не только
для закрытия дескрипторов файлов. С ее помощью можно закрыть любой другой дескриптор. BOOL
CloseHandle( HANDLE hObject);

Слайд 14

#include
void MB(char *s) // Для удобства использования MessageBox
{ MessageBox(NULL, s,

#include 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;

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, // дескриптор // файла или устройства

Механизмы асинхронного ввода-вывода 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

BOOL ReadFileEx( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped, POVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
WriteFileEx( HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE
lpCompletionRoutine );

Слайд 18

Порты завершения ввода/вывода

HANDLE CreateIoCompletionPort
(HANDLE FileHandle, // дескриптор файла HANDLE ExistingCompletionPort, //

Порты завершения ввода/вывода HANDLE CreateIoCompletionPort (HANDLE FileHandle, // дескриптор файла HANDLE ExistingCompletionPort,
дескриптор создаваемого // (или открываемого) порта завершения
ULONG_PTR CompletionKey, // ключ завершения,
// вставляемый в каждый пакет
DWORD NumberOfConcurrentThreads ); //количество // подключаемых потоков

Слайд 19

BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort, //дескриптор порта LPDWORD lpNumberOfBytes, // количество переданных байт

BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, //дескриптор порта LPDWORD lpNumberOfBytes, // количество переданных байт
PULONG_PTR lpCompletionKey, //указатель на ключ // завершения, (если он объявлен ранее)
LPOVERLAPPED *lpOverlapped, //указатель на Overlapped DWORD dwMilliseconds ); // время ожидания пакета

Слайд 20

PostQueuedCompletionStatus( HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred, ULONG_PTR dwCompletionKey, LPOVERLAPPED lpOverlapped );

PostQueuedCompletionStatus( HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred, ULONG_PTR dwCompletionKey, LPOVERLAPPED lpOverlapped );

Слайд 21

Информация об ошибках системной функции Windows

Наиболее экзотической является получение информации об ошибках

Информация об ошибках системной функции Windows Наиболее экзотической является получение информации об
в MS Windows. Во первых, отсутствует какое-либо подобие систематичности в системных функциях. Возвращаемые значения системных функций могут быть описаны как VOID, BOOL, HANDLE, PVOID, LONG или DWORD.
Функция GetLastError() возвращает последнюю ошибку, возникшую в ходе выполнения программы (точнее нити программы). Именно это 32-битное значение дает код ошибки. Собственно коды ошибок, общие для всех системных функций, содержатся в заголовочном файле WinError.h.

Слайд 22

Текстовая информация об ошибке в Windows

Числовые коды ошибок, возвращаемые функцией GetLastError(), достаточно

Текстовая информация об ошибке в 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()

Простейшее использование FormatMessage len=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, k, // k - номер ошибки от
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 в названии функций обозначают

Особенности наименования функции перекодировки Разработчики условным буквосочетанием 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), где последний аргумент возвращаемый, должен быть

Получение координат курсора GetConsoleScreenBufferInfo(HANDLE hConsOut, CONSOLE_SCREEN_BUFFER_INFO* pInfo), где последний аргумент возвращаемый, должен
подготовлен как экземпляр структуры и содержит ряд полей. Главные из них описываются как
COORD dwSize; COORD dwCursorPosition;
Они возвращают пару значений из ширины и высоты окна и координаты курсора в нем.

Слайд 30

Управляющие последовательности как средство управления выводом

В операционных системах Unix и Linux для

Управляющие последовательности как средство управления выводом В операционных системах Unix и Linux
управления курсором и некоторых других действий с экраном и текстовым окном предназначены управляющие последовательности. Идея их использования расширяет управляющие символы, которые в языке Си и Unix служат основным средством управления выводом на экран. Управляющие последовательности определяются стандартом ANSI и называются также
ANSI-последовательностями.

Слайд 31

Запись управляющих последовательностей на языке С

Управляющие последовательности начинаются со специального символа с

Запись управляющих последовательностей на языке С Управляющие последовательности начинаются со специального символа
десятичным эквивалентом 27. Этот код на языке Си в составе текстовых констант записывают в виде '\033'. Здесь использована универсальная форма записи произвольных (в том числе явно не изображаемых) символов в виде восьмеричных констант. Второй символ управляющих последовательностей - обязательный символ ‘[‘ (открывающаяся квадратная скобка), последним символом – латинская буква, детализирующая операцию. Иногда для такой детализации используется и предпоследний символ.

Слайд 32

Управляющая последовательность позиционирования курсора

Для установки курсора служит управляющая последовательность, записываемая на языке

Управляющая последовательность позиционирования курсора Для установки курсора служит управляющая последовательность, записываемая на
Си как текстовая константа
"\033[строка;столбецH"
Здесь компоненты строка и столбец должны быть обязательно заданы десятичными числами и обязательно без дополнительных пробелов. Нумерация позиции считается от 1, так что установка в верхний левый угол экрана требует последовательности \033[1;1H .

Слайд 33

Перемещение курсора в разные стороны

Последовательность
\033[строкаA
приказывает переместить курсор на заданное в

Перемещение курсора в разные стороны Последовательность \033[строкаA приказывает переместить курсор на заданное
ней число строк вверх, последовательность
\033[строкаB
– на заданное число строк вниз,
\033c[столбецC
– на заданное в ней число столбцов вправо, а
\033[столбецD
– на заданное число столбцов влево. Если при заданных значениях параметров курсор должен выйти за пределы экрана, то действие управляющей последовательности игнорируется.

Слайд 34

Получение позиции курсора

Управляющая последовательность
\033[6n
выдает информацию о текущей позиции курсора в в виде

Получение позиции курсора Управляющая последовательность \033[6n выдает информацию о текущей позиции курсора
текста \033[строка;столбецR
Программа должна считывать этот текст, задающий позицию курсора, со стандартного устройства ввода сразу же после записи этой управляющей последовательности. Что оказывается не очень удобно для современного стиля и привычек программирования.

Слайд 35

Очистка части консольного окна и вывод повторяемых символов

В Windows для очистки окна

Очистка части консольного окна и вывод повторяемых символов В Windows для очистки
или его части может быть использован вывод повторяющихся символов, в частности пробелов.
Для этого служат функции
FillConsoleOutputCharacter(HANDLE hConsOut,
CHAR char, WORD len, COORD pos, DWORD* actlen);

Слайд 36

Очистка части консольного окна в Linux

Управляющая последовательность
\033[2J
очищает экран и перемещает курсор

Очистка части консольного окна в Linux Управляющая последовательность \033[2J очищает экран и
в исходное положение (строка 0, столбец 0)
Управляющая последовательность
\033[K
удаляет все символы, начиная с позиции курсора до конца строки (включая символ в позиции курсора).

Слайд 37

Управление цветом текста в Windows

Задание цвета вывода на «ближайшее будущее»
(установки цвета для вывода

Управление цветом текста в Windows Задание цвета вывода на «ближайшее будущее» (установки
на экран консоли)
SetConsoleTextAttribute(HANDLE houtput, WORD attrib).
Задание цвета использует идею атрибутов. Понятие атрибутов включает как цвет собственно символов (в более точных терминах – цвет переднего плана – foreground), так и цвет фона знакового места для символа — background. Цвет здесь относиться не собственно к символу, а к знакоместу. Поэтому может быть установлен предварительно, одновременно с символом или изменен в дальнейшем.

Слайд 38

Кодирование цвета в Windows

Для задания атрибутов в Windows можно использовать символические константы,

Кодирование цвета в 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,

Предварительное или последующее задание атрибутов FillConsoleOutputAttribute(HANDLE hConsOut, WORD attr, DWORD len, COORD
DWORD* actlen);
Как бы «раскрашивает» заданными в атрибуте цветами len знаковых ячейки, начиная с позиции, задаваемой аргументом pos. Возвращаемое значение дает информацию, сколько ячеек удалось раскрасить. Может отличаться от заданного числа, если указанные ячейки выходят за пределы консольного окна.

Слайд 40

Дополнительная возможность: вывод текста с одновременным раскрашиванием

Альтернативой использования SetConsoleTextAttribute является последовательное выполнение

Дополнительная возможность: вывод текста с одновременным раскрашиванием Альтернативой использования SetConsoleTextAttribute является последовательное
функций
FillConsoleOutputAttribute и
WriteConsoleOutputCharacter
WriteConsoleOutputCharacter(HANDLE hConsOut,
CSTR* text, DWORD len, COORD pos,
DWORD* actlen);

Слайд 41

Установка цвета для последующего вывода в Linux

Используются управляющие последовательности
\033[цветm
где компонент цвет задается

Установка цвета для последующего вывода в Linux Используются управляющие последовательности \033[цветm где
одним или несколькими десятичными числами, разделяемыми символами «точка с запятой» (без пробелов).
Для кодирования цвета служат значения из следующей таблицы

Слайд 42

Таблица атрибутов цвета для управляющей последовательности

Цвета изображения Цвета фона
30 Черный

Таблица атрибутов цвета для управляющей последовательности Цвета изображения Цвета фона 30 Черный
40 Черный
31 Красный 41 Красный
32 Зеленый 42 Зеленый
33 Желтый 43 Желтый
34 Голубой 44 Голубой
35 Малиновый 45 Малиновый
36 Бирюзовый 46 Бирюзовый
37 Белый 47 Белый
Первая цифра для фона — 4, для символа — 3 , вторая цифра соответствует десятичному значению трех битов, младший из которых дает красный цвет, средний — зеленый, а старший — синий. (Сокращенно BGR — по буквам цветов)

Слайд 43

Дополнительный атрибут текста

0 Отменить все атрибуты
1 Повышенная яркость

Дополнительный атрибут текста 0 Отменить все атрибуты 1 Повышенная яркость 2 Пониженная
2 Пониженная яркость
4 Подчеркивание
7 Негативное изображение
В современных версиях, в частности на Linux, не работают ранее использовавшиеся атрибуты «Курсив», «Мерцание», «Скрытое изображение»

Слайд 44

Пример управляющей последовательности цвета

Задание ярко-желтого символа на синем фоне, можно получить управляющей

Пример управляющей последовательности цвета Задание ярко-желтого символа на синем фоне, можно получить
последовательностью
\033[1;33;44m
Например
printf(“\033[1;33;44mPrivet\033[0mVsem”)
выведет слово Privet желтыми буквами на синим фоне, а слово Vsem будет выводиться далее белыми буквами на черном фоне.
В Windows управляющие последовательности в настоящее время не используются!!!