Джонсон Харт - Системное программирование в среде Windows

Здесь есть возможность читать онлайн «Джонсон Харт - Системное программирование в среде Windows» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва • Санкт-Петербург • Киев, Год выпуска: 2005, ISBN: 2005, Издательство: Издательский дом Вильямс, Жанр: ОС и Сети, Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Системное программирование в среде Windows: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Системное программирование в среде Windows»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Эта книга посвящена вопросам разработки приложений с использованием интерфейса прикладного программирования операционных систем компании Microsoft (Windows 9х, Windows XP, Windows 2000 и Windows Server 2003). Основное внимание уделяется базовым системным службам, включая управление файловой системой, процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Рассматривается методика переноса приложений, написанных в среде Win32, в среду Win64. Подробно описываются все аспекты системы безопасности Windows и ее практического применения. Изобилие реальных примеров, доступных также и на Web-сайте книги, существенно упрощает усвоение материала.
Книга ориентирована на разработчиков и программистов, как высокой квалификации, так и начинающих, а также будет полезна для студентов соответствующих специальностей.

Системное программирование в среде Windows — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Системное программирование в среде Windows», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Получение номера задачи

Следующие три программы представляют три отдельные функции управления задачами. Все эти функции включены в единый файл JobMgt.c, содержащий все исходные тексты.

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

Программа 6.4. JobMgt: создание информации о новой задаче

/* Вспомогательная функция управления задачами. */

#include "EvryThng.h"

#include "JobMgt.h" /* Листинг приведен в приложении А. */

void GetJobMgtFileName (LPTSTR);

LONG GetJobNumber(PROCESS_INFORMATION *pProcessInfo, LPCTSTR Command)

/* Создать номер задачи для нового процесса и ввести информацию о новом процессе в базу данных задачи. */

{

HANDLE hJobData, hProcess;

JM_JOB JobRecord;

DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;

TCHAR JobMgtFileName[MAX_PATH];

OVERLAPPED RegionStart;

if (!GetJobMgtFileName(JobMgtFileName)) return –1;

/* Предоставление результата в виде строки "\tmp\UserName.JobMgt" */

hJobData = CreateFile(JobMgtFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hJobData == INVALID_HANDLE_VALUE) return –1;

/* Блокировать весь файл плюс одну возможную запись для получения исключительного доступа. */

RegionStart.Offset = 0;

RegionStart.OffsetHigh = 0;

RegionStart.hEvent = (HANDLE)0;

FsLow = GetFileSize(hJobData, &FsHigh);

LockFileEx(hJobData, LOCKFILE_EXCLUSIVE_LOCK, 0, FsLow + SJM_JOB, 0, &RegionStart);

__try {

/* Чтение записи для нахождения пустого сегмента. */

while(ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL) && (nXfer > 0)) {

if (JobRecord.ProcessId == 0) break;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, JobRecord.ProcessId);

if (hProcess == NULL) break;

if (GetExitCodeProcess(hProcess, &ExitCode) && (ExitCode != STILL_ACTIVE)) break;

JobNumber++;

}

/* Либо найден пустой сегмент, либо мы находимся в конце файла и должны создать новый сегмент. */

if (nXfer != 0) /* Не конец файла. Резервировать. */

SetFilePointer(hJobData, –(LONG)SJM_JOB, NULL, FILE_CURRENT);

JobRecord.ProcessId = pProcessInfo->dwProcessId;

_tcsnccpy(JobRecord.CommandLine, Command, MAX_PATH);

WriteFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);

} /* Конец try-блока. */

__finally {

UnlockFileEx(hJobData, 0, FsLow + SJM_JOB, 0, &RegionStart);

CloseHandle(hJobData);

}

return JobNumber + 1;

}

Вывод списка фоновых задач

Программа 6.5 реализует функцию управления задачами DisplayJobs.

Программа 6.5. JobMgt: отображение списка активных задач

BOOL DisplayJobs(void)

/* Просмотреть файл базы данных, сообщить статус задачи. */

{

HANDLE hJobData, hProcess;

JM_JOB JobRecord;

DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;

TCHAR JobMgtFileName[MAX_PATH];

OVERLAPPED RegionStart;

GetJobMgtFileName(JobMgtFileName);

hJobData = CreateFile(JobMgtFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

RegionStart.Offset = 0;

RegionStart.OffsetHigh = 0;

RegionStart.hEvent = (HANDLE)0;

FsLow = GetFileSize(hJobData, &FsHigh);

LockFileEx(hJobData, LOCKFILE_EXCLUSIVE_LOCK, 0, FsLow, FsHigh, &RegionStart);

__try {

while(ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL) && (nXfer > 0)) {

JobNumber++;

if (JobRecord.ProcessId == 0) continue;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, JobRecord.ProcessId);

if (hProcess != NULL) GetExitCodeProcess(hProcess, &ExitCode);

_tprintf(_T(" [%d] "), JobNumber);

if (hProcess == NULL) _tprintf(_T(" Готово"));

else if (ExitCode != STILL_ACTIVE) _tprintf(_T("+ Готово"));

else _tprintf(_T(" "));

_tprintf(_T(" %s\n"), JobRecord.CommandLine);

/* Удалить процессы, которые в системе уже не присутствуют. */

if (hProcess == NULL) {

/* Зарезервировать одну запись. */

SetFilePointer(hJobData, –(LONG)nXfer, NULL, FILE_CURRENT);

JobRecord.ProcessId = 0;

WriteFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);

}

} /* Конец цикла while. */

} /* Конец __try-блока. */

__finally {

UnlockFileEx(hJobData, 0, FsLow, FsHigh, &RegionStart);

CloseHandle(hJobData);

}

return TRUE;

}

Поиск задачи в файле списка задач

Программа 6.6 представляет последнюю функцию управления задачами, FindProcessID, которая получает идентификатор процесса, соответствующего задаче с указанным номером. В свою очередь, идентификатор процесса может использоваться вызывающей программой для получения дескриптора и другой информации о состоянии процесса.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Системное программирование в среде Windows»

Представляем Вашему вниманию похожие книги на «Системное программирование в среде Windows» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Системное программирование в среде Windows»

Обсуждение, отзывы о книге «Системное программирование в среде Windows» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x