Джонсон М. Харт Системное программирование в среде Windows Третье издание Введение Потенциальная аудитория Изменения в третьем издании Как организована эта книга Сопоставление с UNIX и библиотекой С Примеры Web-сайты, посвященные этой книге Благодарности От издательства ГЛАВА 1 Знакомство с Win32 и Win64 Основные возможности операционных систем Эволюция Windows Версии Windows Устаревшие предыдущие версии Windows Windows NT 5.x Другие интерфейсы программирования для Windows Поддержка процессоров Воздействие Windows на ситуацию на рынке Windows, стандарты и открытые системы Библиотеки совместимости Принципы, лежащие в основе Windows Подготовка к работе с Win64 О целесообразности привлечения функций стандартной библиотеки C для обработки файлов Что требуется для работы с данной книгой Пример: простое последовательное копирование файла Копирование файлов с использованием стандартной библиотеки С Копирование файлов с использованием Windows Копирование файлов с использованием вспомогательной функции Windows Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 2 Использование файловой системы и функций символьного ввода/вывода Windows Файловые системы Windows Правила именования файлов Операции открытия, чтения, записи и закрытияфайлов Создание и открытие файла Закрытие файла Чтение файла Запись в файл Вступление: стандартные символы и символы Unicode Альтернативные функции для работы с обобщенными строками Обобщенная функция Main Определения функций Стратегии использования символов Unicode Стандартные устройства и консольный ввод/вывод Пример: вывод на консоль сообщений и подсказок для пользователя Пример: обработка ошибок Пример: копирование нескольких файлов на стандартное устройство вывода Пример: преобразование символов из ASCII в Unicode Производительность программы Управление файлами и каталогами Управление файлами Управление каталогами Пример: печать текущего каталога Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 3 Усовершенствованные средства для работы с файлами и каталогами и знакомство с реестром 64-битовая файловая система Указатели файлов 64-битовая арифметика Указание позиции файла с помощью структуры OVERLAPPED Определение размера файла Установка размера файла, инициализация файла и разреженные файлы Пример: обновление записей, находящихся в произвольном месте файла Атрибуты файлов и управление каталогами Полные имена файлов Другие методы определения атрибутов файлов и каталогов Именование временных файлов Точки монтирования Пример: вывод списка атрибутов файла Пример: установка меток времени файла Стратегии обработки файлов Блокирование файлов Следствия принятой логики блокирования файлов Реестр Ключи реестра Управление системным реестром Управление подразделами реестра Управление значениями Пример: вывод списка разделов и содержимого реестра Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 4 Обработка исключений Исключения и обработчики исключений Блоки try и except Выражения фильтров и их значения Коды исключений Резюме: последовательность обработки исключений Исключения, возникающие при выполнении операций над числами с плавающей точкой Ошибки и исключения Исключения, генерируемые приложением Пример: обработка ошибок как исключений Обработчики завершения Выход из try-блока Аварийное завершение Выполнение обработчика завершения и выход из него Сочетание блоков finally и except Глобальное и локальное разворачивание стека Обработчики завершения: завершение процессов и потоков SEH и обработка исключений в C++ Пример: использование обработчиков завершения для повышения качества программ Пример: использование функции фильтра Обработчики управляющих сигналов консоли Пример: обработчик управляющих сигналов консоли Векторная обработка исключений Резюме В следующих главах Упражнения ГЛАВА 5 Управление памятью, отображение файлов и библиотеки DLL Архитектура системы управления памятью в Win32 и Win64 Обзор методов управления памятью Куча Управление памятью кучи Другие функции кучи Резюме: управление кучами Пример: сортировка файлов с использованием бинарного дерева поиска Отображение файлов Объекты отображения файлов Отображение файла на адресное пространство процесса Ограничения метода отображения файлов Резюме: отображение файлов Пример: последовательная обработка файлов с использованием метода отображения Пример: сортировка отображенных файлов Базовые указатели Пример: использование базовых указателей Динамически компонуемые библиотеки Статические и динамические библиотеки Неявное связывание Явное связывание Пример: явное связывание функци и преобразования файлов Создание библиотек DLL на основе функции Asc2Un Точки входа библиотеки DLL Управление версиями DLL Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 6 Управление процессами Процессы и потоки Windows Создание процесса Указание исполняемого модуля и командной строки Наследуемые дескрипторы Счетчики дескрипторов процессов Идентификаторы процессов Дублирование дескрипторов Завершение и прекращение выполнения процесса Ожидание завершения процесса Блоки и строки окружения Защита процесса Пример: параллельный поиск указанного текстового шаблона Процессы в многопроцессорной среде Временные характеристики процесса Пример: временные характеристики процессов Использование команды timep Генерация управляющих событий консоли Пример: простое управление задачами Создание фоновых задач Получение номера задачи Вывод списка фоновых задач Поиск задачи в файле списка задач Объекты задач Резюме В следующих главах Упражнения ГЛАВА 7 Потоки и планирование выполнения Обзор потоков Перспективы и проблемы Основные сведения о потоках Управление потоками Идентификация потоков Дополнительные функции управления потоками Приостановка и возобновление выполнения потока Ожидание завершения потока Удаленные потоки Использование библиотеки С впотоках Библиотеки с многопоточной поддержкой Пример: многопоточный поиск контекста Потоки и производительность Модель "хозяин/рабочий" и другие модели многопоточных приложений Пример: применение принципа "разделяй и властвуй" для решения задачи сортировки слиянием в SMP-системах Производительность Локальные области хранения потоков Приоритеты процессов и потоков и планирование выполнения Предостережение относительно использования приоритетов потоков и процессов Состояния потоков Возможные ловушки и распространенные ошибки Ожидание в течение конечного интервала времени Облегченные потоки Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 8 Синхронизация потоков Необходимость в синхронизации потоков Критические участки кода Функции взаимоблокировки Локальная и глобальная память Резюме: безопасный многопоточный код Объекты синхронизации потоков Объекты критических участковкода Настройка спин-счетчика Использование объектов CRITICAL_SECTION для защиты разделяемыхпеременных Пример: простая система "производитель/потребитель" Комментарии к примеру простой системы "производитель/потребитель" Мьютексы Покинутые мьютексы Мьютексы, критические участки кода и взаимоблокировки Сравнительный обзор: мьютексы и объекты CRITICAL_SECTION Синхронизация куч Семафоры Использование семафоров Ограниченность семафоров События Обзор: четыре модели использования событий Пример: система "производитель/потребитель" Обзор: объекты синхронизации Windows Ожидание сообщений и объектов Дополнительные рекомендации относительно использования мьютексов и объектов CRITICAL_SECTION Другие функции взаимоблокировки Учет факторов производительности при организации управленияпамятью Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 9 Влияние синхронизации на производительность и рекомендации по ее повышению Влияние синхронизации на производительность Достоинства и недостатки объектов CRITICAL_SECTION Модельная программа для исследования факторов производительности Настройка производительности SMP-систем с помощью спин-счетчиков Установка значений спин-счетчиков Дросселирование семафора для уменьшения состязательности между потоками Родство процессоров Маски родства системы, процесса и потока Определение количества процессоров в системе Гиперпотоки и счетчик процессоров Порты завершения ввода/вывода Рекомендации по повышению производительности и возможные риски Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 10 Усовершенствованные методы синхронизации потоков Модель переменных условий и свойства безопасности Совместное использование событий и мьютексов Модель переменных условий Использование функции SignalObjectAndWait Пример: объект порогового барьера Комментарии по поводу реализации объекта порогового барьера Объект очереди Комментарии по поводу функций управления очередью с точки зрения производительности Пример: использование очередей в многоступенчатом конвейере Комментарии по поводу многоступенчатого конвейера Асинхронные вызовы процедур Очередизация асинхронных вызовов процедур АРС и упущенные сигналы Состояния дежурного ожидания Безопасная отмена выполнения потоков Создание переносимых приложений с использованием потоков Pthreads Стеки потоков и допустимые количества потоков Рекомендации по проектированию, отладке и тестированию программ Как избежать создания некорректного программного кода За рамками Windows API Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 11 Взаимодействие между процессами Анонимные каналы Пример: перенаправление ввода/вывода с использованием анонимного канала Именованные каналы Использование именованных каналов Создание именованных каналов Подключение клиентов именованных каналов Функции состояния именованных каналов Функции подключения именованных каналов Подключение клиентов и серверов именованных каналов Функции транзакций именованных каналов Определение наличия сообщений в именованных каналах Пример: клиент-серверный процессор командной строки Комментарии по поводу клиент-серверного процессора командной строки Почтовые ящики Использование почтовых ящиков Создание и открытие почтового ящика Создание, подключение и именование каналов и почтовых ящиков Пример: сервер, обнаруживаемый клиентами Комментарии по поводу многопоточных моделей Резюме В следующих главах Упражнения ГЛАВА 12 Сетевое программирование с помощью сокетов Windows Сокеты Windows Инициализация Winsock Создание сокета Серверные функции сокета Связывание сокета Перевод связанного сокета в состояние прослушивания Прием клиентских запросов соединения Отключение и закрытие сокетов Пример: подготовка и получение клиентских запросов соединения Клиентские функции сокета Установление клиентского соединения с сервером Пример: подключение клиента к серверу Отправка и получение данных Сравнение именованных каналов и сокетов Сравнение серверов именованных каналов и сокетов Сравнение клиентов именованных каналов и сокетов Пример: функция приема сообщений в случае сокета Пример: клиент на основе сокета Пример: усовершенствованный сервер на основе сокетов Замечания по поводу безопасности Внутрипроцессные серверы Ориентированные на строки сообщения, точкив хода DLL и TLS Решение проблемы долговременных состояний в многопоточной среде Пример: безопасная многопоточная DLL для обмена сообщениями через сокет Комментарии по поводу DLL и безопасной многопоточной среды Пример: альтернативная стратегия создания безопасных библиотек DLL с много поточной поддержкой Дейтаграммы Использование дейтаграмм для удаленного вызова процедур Сравнение Berkeley Sockets и Windows Sockets Перекрывающийся ввод/вывод с использованием Windows Sockets Windows Sockets 2 Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 13 Windows Services Написание программ, реализующихслужбы Windows Services: обзор Функция main() Функции ServiceMain() Регистрация управляющей программы службы Настройка состояния службы Структура SERVICE_STATUS Специфический для службы код Обработчик управляющих команд службы Пример: "интерфейсная оболочка" службы Управление службами Windows Открытие SCM Создание и удаление службы Запуск службы Управление службой Опрос состояния службы Резюме: функционирование и управление службой Пример:команднаяоболочкауправленияслужбами Совместное использование объектов ядра приложениями и службами Регистрация событий Замечания по отладке службы Резюме В следующих главах Дополнительная литература Упражнения ГЛАВА 14 Асинхронный ввод/вывод и порты завершения Обзор методов асинхронного ввода/вывода Windows Перекрывающийся ввод/вывод Перекрывающиеся сокеты Следствия применения перекрывающегося ввода/вывода Структуры OVERLAPPED Состояния перекрывающегося ввода/вывода Отмена выполнения операций перекрывающегося ввода/вывода Пример: использование дескриптора файла в качестве объекта синхронизации Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации Расширенный ввод/вывод с использованием процедуры завершения Функции ReadFileEx, WriteFileEx и процедурызавершения Функции дежурного ожидания Выполнение процедуры завершения и возврат из функции дежурного ожидания Пример: преобразование файла с использованием расширенного ввода/вывода Асинхронный ввод/вывод сиспользованием нескольких потоков Таймеры ожидания Пример: использование таймера ожидания Комментарии к примеру с таймером ожидания Порты завершения ввода/вывода Управление портами завершения ввода/вывода Ожидание порта завершения ввода/вывода Отправка уведомления порту завершения ввода/вывода Альтернативы портам завершенияввода/вывода Пример: сервер, использующий порты завершения ввода/вывода Резюме В следующих главах Упражнения ГЛАВА 15 Безопасность объектов Windows Атрибуты безопасности Общий обзор средств безопасности: дескриптор безопасности Списки контроля доступа Использование объектов безопасности Windows Права объектов и доступ к объектам Инициализация дескриптора безопасности Управляющие флаги дескриптора безопасности Идентификаторы безопасности Работа с ACL Пример: использование разрешений на доступ в стиле UNIX к файлам NTFS Пример: инициализация атрибутов защиты Комментарии к программе 15.3 Чтение и изменение дескрипторов безопасности Пример: чтение разрешений на доступ к файлу Пример: изменение разрешений на доступ к файлу Защита объектов ядра и коммуникаций Защита именованных каналов Защита объектов ядра и приватных объектов Значения маски АСЕ Пример: защита процесса и его потоков Обзор дополнительных возможностей защиты объектов Удаление элементов АСЕ Абсолютные и самоопределяющиеся относительные дескрипторы безопасности Системные списки ACL Информация, хранящаяся в маркерах доступа Управление идентификаторами SID Протокол защищенных сокетов Резюме В следующей главе Дополнительная литература Упражнения ГЛАВА 16 Программирование в среде Win64 Нынешнее состояние Win64 Поддержка процессоров Поддержка Windows Поддержка сторонних компаний Обзор 64-разрядной архитектуры Необходимость в 64-битовой адресации Опыт UNIX Опыт перехода от 16-разрядных версий Windows к 32-разрядным Надолго ли хватит 64 бит? Модель программирования Win64 Цели Типы данных Типы данных фиксированной точности Типы данных, соответствующие точности указателей Пример: использование указательных типов данных Различия между Windows и UNIX Перенос имеющегося программного кода Изменения, связанные с использованием API Изменения, связанные с устранением неявных допущений относительно предполагаемых размеров элементов данных Пример: перенос программы sortMM (программа 5.5) Использование предупреждающих сообщений компилятора Код до подготовки к переносу Предупреждающие сообщения компилятора Предупреждающие сообщения и необходимые изменения, касающиеся других программ Резюме Дополнительная литература Упражнения ПРИЛОЖЕНИЕ А Использование примеров программ Структура каталогов Учебные пособия (слайды) Каталог Utility Каталог Include Распределение программ по главам Листинги включаемых файлов Дополнительные служебные программы ПРИЛОЖЕНИЕ Б Сопоставление функций Windows, UNIX и библиотеки С ПРИЛОЖЕНИЕ В Результаты измерения производительности Тестовые конфигурации Приложения Хост-системы Измерение производительности Копирование файлов Преобразование символов из кодировки ASCII в Unicode Поиск заданных комбинаций символов Сортировка файлов Множество потоков, соревнующихся между собой за обладание единственным ресурсом Выполнение тестов Библиография
Потенциальная аудитория • Все, кто хочет быстро научиться разрабатывать приложения, независимо от уровня подготовки.
• Программисты и специалисты по разработке программного обеспечения, перед которыми стоит задача переноса существующих приложений, написанных, в частности, для UNIX, на любую из платформ Windows. В книге демонстрируются сравнительные возможности функций и моделей программирования, связанных с использованием Windows, UNIX и стандартной библиотеки С. Каждая из обычных функциональных возможностей UNIX, включая управление процессами, синхронизацию, файловые системы и межпроцессное взаимодействие, рассматривается в терминах Windows.
• Читатели, приступающие к разработке новых проектов, которые не ограничены в своих действиях необходимостью переноса имеющихся программных кодов на другие платформы. В книге охвачены многие аспекты проектирования и реализации программ и продемонстрированы способы использования функций Windows для создания полезных приложений и решения обычных задач программирования.
• Программисты, использующие СОМ и .NET Framework, которые найдут здесь массу полезной информации, облегчающей изучение принципов работы динамически подключаемых библиотек (dynamic link libraries, DLL), моделей потоков и способов их применения, интерфейсов и синхронизации.
• Студенты, изучающие компьютерные дисциплины на старших курсах вузов или занятые подготовкой дипломных работ, связанных с системным программированием или разработкой приложений. Книга будет полезна также тем, кто изучает многопоточное программирование или сталкивается с необходимостью создания сетевых приложений. Ее также можно использовать в качестве полезного дополнения к таким, например, источникам, как книга У. Ричарда Стивенса (W. Richard Stevens) Advanced Programming in the UNIX Environment (см. библиографию), что позволит студентам сравнить возможности Windows и UNIX. Эта книга будет хорошим подспорьем и для студентов, проходящих курс ОС, поскольку в ней показано, какими именно средствами обеспечивается базовая функциональность ОС, представляющих интерес в коммерческом отношении.
Единственным допущением, которое неявно присутствует во всем вышесказанном, является предположение о том, что читатели имеют опыт программирования на языке С.