Системное программирование в среде Win32

2-е издание
Джонсон М. Харт

Win32 System Programming: A Windows 2000 Application Developer's Guide Second Edition
Johnston Hart
книга Системное программирование в среде Win32, 2-е издание

Тираж данной книги закончился.
Введение
Файлы к книге
Рецензии на книгу

Эта книга рассчитана на тех, кто имеет опыт программирования в профессиональных ОС, но не знаком с Win32 API. В ней рассказывается, как использовать интерфейс программирования приложений (API) Win32 и зарождающийся Win64 API. Основное внимание уделяется системным службам ядра, включая файловую систему, управление процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Функции пользовательского интерфейса здесь не рассматриваются. Примеры посвящены именно тем ситуациям, которых можно ожидать на практике, и которые можно непосредственно использовать в качестве основы для реальных приложений.Основная цель книги - объяснить, что такое Win32 и показать, как использовать его в реальных ситуациях. Данную книгу нельзя назвать всеобъемлющей, тем не менее, в ней представлены основные свойства наиболее важных функций и способы их применения в реальных программных ситуациях.

464 стр., с ил.; ISBN 5-8459-0177-4, 0-201-70310-6; формат 70x100/16; 2001, 3 кв.; Вильямс.



Понравилась книга? Порекомендуйте её друзьям и коллегам:







Книги, рекомендуемые вместе с этой книгой:

Раздел каталога:



Предисловие

В этой книге показано, как использовать интерфейс прикладного программирования (Application Programming Interface — API) Win32 и зарождающийся Win64 API. При этом основное внимание уделяется системным службам ядра, включающим в себя файловую систему, управление процессами и потоками, межпроцессное взаимодействие, сетевое программирование и синхронизацию. Пользовательские интерфейсы, внутренняя логика приложений, драйверы ввода-вывода, хотя и являются важными и интересными темами, остаются за рамками данной книги. Примеры фокусируются на тех ситуациях, которые вполне возможны на практике, и потому могут использоваться в качестве основы для реальных приложений.

API Win32 поддерживается семейством 32-разрядных операционных систем компании Microsoft: Windows 2000, Windows NT, Windows 98, Windows 95 и Window CE. На него во многом похож Win64 — 64-разрядный интерфейс, который будет поддерживаться в Windows 2000; вопросы переноса кода рассматриваются по мере необходимости. Не вызывает сомнения, что Win32, наряду с Win64 , является важным инструментом для разработчиков приложений и как более предпочтительный API часто заменяет UNIX в прикладных программах, предназначенных для настольных и серверных систем. Многие эксперты предсказывают, что Win32 станет доминирующим программным интерфейсом, хотя мне представляется, что UNIX и Win32 будут сосуществовать и каждый из них найдет собственную нишу.

Независимо от результатов войны операционных систем, многие опытные программисты хотели бы быстро изучить API Win32, и данная книга должна помочь им в этом.

Основная цель книги — объяснить, что такое Win32, показать, как использовать его в реальных ситуациях, и сделать это как можно быстрее, не утруждая читателя излишними подробностями. Таким образом, книга не является всеобъемлющей, но в то же время объясняет основные свойства наиболее важных функций и показывает, как применять их в реальных программных ситуациях. Вооруженный такими знаниями, читатель сможет воспользоваться обширной справочной документацией Microsoft для изучения подробностей, дополнительных опций и бегло затронутых вопросов, если это будет продиктовано его интересами. Я пришел к выводу, что при таком подходе изучить API Win32 достаточно легко, и в целом, несмотря на отдельные разочарования, с большим удовольствием разрабатывал программы Win32. Временами мой энтузиазм будет весьма заметен. Это не означает, что я считаю Win32 лучшим программным интерфейсом, но у него, конечно, много замечательных свойств.

Многие книги по Win32 строятся на предположении, что пользователь знаком только с программированием в 16-разрядной Windows 3.1. В этих книгах много усилий тратится на объяснение того, как работают процессы, виртуальная память, межпроцессная связь, вытесняющее планирование, и не показано, как все это использовать в реальных ситуациях. Программист с опытом работы в UNIX, VAX VMS, IBM MVS или иной операционной системе высокого класса (можно сказать, почти любой системе, отличной от давно устаревшей Windows 3.1 с API Win16), естественно, знаком с этими концепциями и больше интересуется их непосредственной реализацией в Win32. Кроме того, в большинстве книг по Win32 уделяется внимание преимущественно программированию пользовательского интерфейса. В интересах концентрации на важных свойствах ядра в данной книге не затрагивается пользовательский интерфейс, за исключением обсуждения простого символьного ввода-вывода с консоли.

Автор книги придерживается той точки зрения, что Win32 — это всего лишь API операционной системы (ОС), и дает вполне понятный набор функций. Многие программисты, независимо от их опыта, испытывают потребность в быстром изучении Win32 и операционной системы Windows, а понимание Win32 неоценимо при обсуждении таких вопросов, как объектная модель компонентов Microsoft (Component Object Model — COM). Системы Windows в сравнении с другими системами обладают хорошими, плохими и средними качествами. Цель данной книги — показать, как эффективно использовать эти свойства и в реальных ситуациях разрабатывать полезные, высококачественные и высокопроизводительные приложения.

Потенциальные читатели

  • Все, кто имеет опыт программирования в UNIX или иной операционной системе (даже Windows 3.1) и кто хочет быстро изучить Win32.
  • Программисты и разработчики, которым необходимо перенести существующие приложения, часто из системы UNIX, в Win32 для работы под управлением Windows 2000 или любой другой платформы Windows. В данной книге содержится много сравнений между функциями и моделями программирования Win32, UNIX и стандартной библиотеки C. Все основные функциональные возможности UNIX, включая управление процессами, синхронизацию, файловые системы и межпроцессное взаимодействие, описываются средствами Win32.
  • Программисты, разрабатывающие серверы или другие системы и компоненты, в которых управление ресурсами, например процессами и потоками, имеет главное значение, а пользовательский интерфейс — второстепенное.
  • Программисты, использующие COM или DCOM, найдут здесь много полезной информации для понимания работы DLL COM, моделей потоков, интерфейсов и синхронизации.
  • Читатели, начинающие новый проект и не связанные ограничениями переноса существующего кода. Рассматриваются многие аспекты проектирования и реализации программ, функции Win32 применяются для создания полезных приложений и решения распространенных проблем программирования.
  • Студенты старших курсов компьютерных специальностей, изучающие спецкурсы по системному программированию и разработке приложений. Книга будет полезна всем, кто изучает многопоточное программирование или занимается разработкой сетевых приложений. Данная книга удачно дополняет книгу У.Р. Стивенса Углубленное программирование в среде UNIX (W. Richard Stevens. Advanced Programming in the UNIX Environment, см. раздел "Библиография"); студенты могут сравнить Win32 и UNIX. Для тех, кто изучает операционные системы, книга будет полезным источником информации о том, как реализованы важнейшие функции ОС в системе, получившей всеобщее признание.

Подразумевается, что перечисленные выше категории читателей знакомы с программированием на С.

Структура книги

Тематически главы организованы следующим образом: вначале рассматриваются функции, необходимые даже в однопоточном приложении, за ними следуют функции управления процессами и потоками, а в конце описывается сетевое программирование в многопоточной среде. Это позволяет читателю логически переходить от файловых систем к обеспечению безопасности, управлению памятью и отображению файлов, затем к процессам, потокам и синхронизации и, наконец, к межпроцессному и сетевому взаимодействию. Подобная организация также позволяет достаточно естественно вводить примеры, так что разработчик может создать простой прототип, а затем добавить дополнительные возможности. Такие дополнительные функции, как асинхронный ввод-вывод, появляются позже.

В каждой главе после вводного описания рассматриваемой темы, например управления процессами или отображения файлов в память, детально рассматриваются важнейшие функции Win32 и их взаимосвязи. Затем следуют иллюстративные примеры. В тексте приводятся только самые необходимые части программ, полные же их версии, а также требуемые файлы включения, вспомогательные функции и прочее находятся либо в приложении, либо в архиве примеров . Везде специально оговариваются функции и возможности, которые поддерживаются только в Windows 2000 и NT, поскольку в Windows 98, 95 и CE многие дополнительные возможности не реализованы. В каждой главе предлагается дополнительная литература по теме и приводится несколько примеров. Многие упражнения затрагивают интересные и важные вопросы, которые не совсем подходят для основного текста, другие дают читателю возможность поэкспериментировать с дополнительным или специальным материалом.

Глава 1 — высокоуровневое введение в семейство ОС Windows и Win32. Здесь на простом примере демонстрируются базовые элементы стиля программирования в Win32 и закладывается основа для более сложных функций Win32. Вопросы, относящиеся к Win64 и переносу кода, впервые поднимаются в главе 1, подробно рассматриваются в главе 16 и по мере необходимости затрагиваются в других главах.

В главах 2 и 3 рассматриваются файловые системы, консольный ввод-вывод, блокировка файлов и управление каталогами. В главе 2 также описывается Unicode — расширенный набор символов, применяемый в Windows 2000/NT. Примеры включают последовательную и прямую обработку файлов и программу обхода каталогов. Глава 3 заканчивается обсуждением программного управления реестром, которое во многом похоже на управление файлами и каталогами.

В главе 4 рассматривается структурная обработка исключений (Structured Exception Handling — SEH), которая в дальнейшем постоянно упоминается в книге. Многие авторы откладывают описание SEH на последние главы, но более раннее рассмотрение позволяет обращаться к SEH по ходу почти всего изложения и тем самым облегчает некоторые задачи программирования и улучшает качество программных продуктов.

В главе 5 обсуждаются вопросы безопасности Windows NT и приводится пример, эмуляции прав доступа к файлам, принятых в UNIX. Функции безопасности затем можно будет по мере необходимости применить во многих примерах. Хотя безопасность и используется в последующих главах, данную главу можно пропустить, если эта тема вас не интересует.

В главе 6 рассматривается управление памятью в Win32 и показано, как использовать отображаемые в память файлы (memory-mapped files) для упрощения программы и повышения быстродействия. В этой главе также описываются библиотеки динамической компоновки (dynamic link libraries — DLL).

В главе 7 представлены процессы Win32, управление процессами и простая синхронизация процессов. Затем аналогичным образом в главе 8 описывается управление потоками. В каждой из глав на примерах демонстрируются преимущества потоков и процессов, в том числе упрощение кода и повышение эффективности.

Главы 9 и 10 дают расширенную и детальную трактовку синхронизации потоков — одной из самых сильных характеристик Win32. Синхронизация — тема довольно сложная, поэтому изложение базируется на подробных примерах и хорошо понятных моделях, которые помогут читателю воспользоваться преимуществами потоков в программировании, учесть их влияние на производительность и обойти при этом множество "подводных камней".

Главы 11 и 12 посвящены межпроцессному и межпотоковому взаимодействию и работе в сети. Глава 11 концентрируется на объектах, которые составляют важную часть Win32, а именно каналах (pipes), именованных каналах (named pipes) и почтовых ячейках (mailslots). В главе 12 рассматривается интерфейс Windows Sockets, благодаря которому можно взаимодействовать с отличными от Windows системами по стандартным протоколам, в основном TCP/IP. Windows Sockets, хотя, строго говоря, и не входит в состав Win32, обеспечивает обмен информацией и возможность взаимодействия с другими системами через сеть и через Internet. Данный материал используется во всех последующих главах книги. Использование межпроцессной связи совместно с потоками показано на примере многопоточной системы клиент/сервер.

В главе 13 описана поддержка в Windows 2000 и Windows NT служб NT, которые позволяют управлять постоянно работающими серверами, аналогичными описанным в главах 11 и 12. Небольшие программные изменения превращают эти серверы в службы NT.

В главе 14 показаны различные методы асинхронного ввода-вывода: с перекрытием, с событиями и процедурами завершения. Для файловых систем данная возможность реализуется только в Windows 2000 и NT, хотя почти того же можно достичь с помощью потоков. Но еще один подобный метод — порты завершения ввода-вывода — незаменим для масштабируемых многопоточных серверов, и потому эта особенность иллюстрируется на примере серверов, создание которых рассматривается в главах 11, 12 и 13. Описываются также таймеры ожидания (waitable timers), поскольку именно для них нужны концепции, представленные в главе 14.

Глава 15 завершает обзор Win32 двумя специальными темами: удаленные вызовы процедур (Remote Procedure Calls — RPC) и объектная модель компонентов Microsoft (Component Object Model — COM). Эти темы интегрируют в себе большую часть концепций, изложенных в книге. RPC и COM часто используют функции, описанные в этой книге. Приводятся простые примеры, а также отмечается, что читатели теперь имеют всю необходимую информацию для того, чтобы изучать другие отрасли Win32, не относящиеся к базовым системным службам.

В главе 16 рассматриваются вопросы программирования в Win64 и показано, как спланировать перенос кода и мобильность программ.

За главами следуют три приложения. В приложении А приведен перечень программ в архиве примеров и описано, как их использовать. Приложение Б содержит несколько таблиц, в которых сравниваются функции Win32 и их аналоги в UNIX и стандартной библиотеке C. В приложении В сравнивается быстродействие различных реализаций некоторых приведенных в книге примеров, так что можно оценить преимущества и недостатки функций Win32 (как основных, так и дополнительных) и функций библиотеки C.

Дополнения ко второму изданию

Во второе издание книги включен новый материал и выполнено существенное обновление и реорганизация старого. Цель переиздания книги такова:

  • описать перенос приложений в Windows 2000 и Win64;
  • расширить описание потоков и синхронизации (вновь введены глава 10 и примеры в главе 9);
  • добавить материал по сокетам, удаленным вызовам процедур (главы 12 и 15) и службам NT (глава 13), что позволяет рассмотреть вопросы, важные при разработке служб и серверов, особенно для Windows 2000;
  • более глубоко рассмотреть влияние потоков и синхронизации на быстродействие (главы 9 и 10);
  • учесть замечания читателей и студентов: исправить ошибки, улучшить пояснения и структуру книги, обратить внимание на целый ряд мелких деталей.

Примечания и таблицы, касающиеся UNIX и библиотеки языка C

По ходу изложения там, где необходимо, стиль и функциональные возможности Win32 сравниваются с сопоставимыми возможностями UNIX (и LINUX) и стандартной библиотеки ANSI C. Таблицы с перечнем сравниваемых функций приводятся в приложении Б. Эта информация включена в силу того, что многие читатели знакомы с UNIX и заинтересованы в сравнении этих двух систем. Читатели, не знакомые с UNIX, могут пропустить данный материал. Эти разделы выделяются отступом и мелким шрифтом.

Примеры

Примеры разработаны с такой целью:

  • проиллюстрировать наиболее распространенные, представительные и полезные применения функций Win32;
  • оказать помощь в реальных ситуациях программирования, которые встречаются при разработке программ, при консультациях и обучении. Некоторые мои клиенты и участники курсов использовали примеры в кодах как основу для их собственных систем. Работая консультантом, я часто встречаю код, похожий на тот, что используется в примерах, а несколько раз даже видел программы, взятые непосредственно из первого издания книги. (Вы можете поступить так же, и я буду весьма признателен, если вы сошлетесь на меня в своей документации.) Зачастую этот код входит в состав объектов COM или C++. Приведенные примеры взяты из реального мира и решают проблемы реального мира.
  • подчеркнуть, что функции ведут себя и взаимодействуют друг с другом в действительности не всегда так, как может показаться после изучения документации. Везде в этой книге, в тексте и примерах, я акцентирую больше внимания на взаимодействии функций, чем на самих функциях;
  • постепенно увеличивать и расширять программы, естественно и просто добавляя новые возможности к предыдущим решениям, и исследовать альтернативные методы реализации;
  • в начальных главах во многих примерах используются такие команды UNIX, как ls, touch, chmod и sort, что позволяет показать функции Win32 в знакомом читателю контексте, одновременно создавая набор полезных служебных функций . Кроме того, разные реализации одной и той же команды позволяют оценить выигрыш в быстродействии, полученный благодаря дополнительным возможностям Win32. В приложении В приведены результаты таких измерений быстродействия.

В начальных главах примеры обычно короткие, а в последующих, если требуется, могут быть значительно длиннее.

Упражнения в конце каждой главы предлагают альтернативные разработки, темы для исследования и дополнительные функциональные возможности, которые важны, но выходят за рамки данной книги. Упражнения могут быть и достаточно легкими, и требующими значительных усилий. Поскольку исправление программных ошибок — отличный способ повышать мастерство, то часто предлагаются явно обозначенные неверные решения.

Все примеры были отлажены и протестированы в Windows 2000 и NT, а где это было возможно — в Windows 98 и 95. При тестировании в Windows NT использовалась версия 4.0, и хотя большая часть разработки выполнялась на однопроцессорных системах Intel, многие программы были протестированы также и на многопроцессорных системах. Приложения клиент/сервер проверялись при наличии большого числа клиентов, одновременно взаимодействующих с сервером. Тем не менее мы не даем никаких гарантий корректности программ, их полноты и применимости для любых целей. Несомненно, даже самые простые примеры содержат ошибки или могут не работать при некоторых условиях; такова судьба почти всех программ. Все же я буду весьма признателен за любые сообщения о программных дефектах, а еще больше — за исправления.

Опечатки в книге, дополнительные примеры и пояснения, предложения читателей и многое другое можно найти на моей домашней страничке: http://world.std.com/~jmhart. По мере выявления и исправления ошибок, а также поступления предложений от читателей код примеров будет обновляться. Если у вас возникают какие-либо трудности с использованием программ или иным материалом книги, то прежде всего посетите этот узел — возможно, там уже есть исправление или пояснение. Если же вы их не найдете, то всегда можете послать мне электронное письмо по адресу: jmhart@world.std.com.


Copyright © 1992-2015 Издательская группа "Диалектика-Вильямс"

Rambler  Top100