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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

HANDLE hNp; /* и которые представляют еще не выполненные операции */

REQUEST Req; /* ReadFile и ConnectNamedPipe. */

DWORD Type; /* 0 – ConnectNamedPipe; 1 – ReadFile. */

OVERLAPPED Ov;

} CP_KEY;

static CP_KEY Key[MAX_CLIENTS_CP]; /* Доступно всем потокам. */

/* … */

_tmain(int argc, LPTSTR argv[]) {

HANDLE hCp, hMonitor, hSrvrThread[MAXCLIENTS];

DWORD iNp, iTh, MonitorId, ThreadId;

THREAD_ARG ThArgs[MAX_SERVER_TH];

/*…*/

hCp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, MAX_SERVER_TH);

/* Создать перекрывающийся именованный канал для каждого потенциального */

/* клиента, добавить порт завершения и ожидать соединения. */

/* Предполагается, что максимальное количество клиентов намного */

/* превышает количество серверных потоков. */

for (iNp = 0; iNp < MAX_CLIENTS_CP; iNp++) {

memset(&Key[iNp], 0, sizeof(CP_KEY));

Key[iNp].hNp = CreateNamedPipe(SERVER_PIPE, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_READMODE_MESSAGE | PIPE_TYPE_MESSAGE | PIPE_WAIT, MAX_CLIENTS_CP, 0, 0, INFINITE, pNPSA);

CreateIoCompletionPort(Key[iNp].hNp, hCp, iNp, MAX_SERVER_TH + 2);

Key[iNp].Ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

ConnectNamedPipe(Key[iNp].hNp, &Key[iNp].Ov);

}

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

for (iTh = 0; iTh < MAX_SERVER_TH; iTh++) {

ThArgs[iTh].hCompPort = hCp;

ThArgs[iTh].ThreadNo = iTh;

GetTempFileName(_T("."), _T("CLP"), 0, ThArgs[iTh].TmpFileName);

hSrvrThread[iTh] = (HANDLE)_beginthreadex (NULL, 0, Server, &ThArgs[iTh], 0, &ThreadId);

}

/* Дождаться завершения всех потоков и "убрать мусор". */

/* … */

return 0;

}

static DWORD WINAPI Server(LPTHREAD_ARG pThArg)

/* Функция потока сервера.

Имеется по одному потоку для каждого потенциального клиента. */

{

HANDLE hCp, hTmpFile = INVALID_HANDLE_VALUE;

HANDLE hWrEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

DWORD nXfer, KeyIndex, ServerNumber;

/* … */

BOOL Success, Disconnect, Exit = FALSE;

LPOVERLAPPED pOv;

OVERLAPPED ovResp = {0, 0, 0, 0, hWrEvent}; /*Для ответных сообщений.*/

/* Чтобы избежать помещения перекрывающейся операции в очередь порта завершения, должен быть установлен младший бит события. Несмотря на всю странность этого способа, он документирован. */

ovResp.hEvent = (HANDLE)((DWORD)hWrEvent | 0x1);

GetStartupInfo(&StartInfoCh);

hCp = pThArg->hCompPort;

ServerNumber = pThArg->ThreadNo;

while(!ShutDown && !Exit) __try {

Success = FALSE; /* Устанавливается только в случае успешного завершения всех операций. */

Disconnect = FALSE;

GetQueuedCompletionStatus(hCp, &nXfer, &KeyIndex, &pOv, INFINITE);

if (Key [KeyIndex].Type == 0) { /* Соединение установлено. */

/* Открыть временный файл с результатами для этого соединения. */

hTmpFile = CreateFile(pThArg->TmpFileName, /* … */);

Key[KeyIndex].Type = 1;

Disconnect = !ReadFile(Key[KeyIndex].hNp, &Key[KeyIndex].Req, RQ_SIZE, &nXfer, &Key[KeyIndex].Ov) && GetLastError () == ERROR_HANDLE_EOF; /* Первая операция чтения. */

if (Disconnect) continue;

Success = TRUE;

} else {

/* Чтение завершилось. Обработать запрос. */

ShutDown = ShutDown || (_tcscmp (Key[KeyIndex].Req.Record, ShutRqst) == 0);

if (ShutDown) continue;

/* Создать процесс для выполнения команды. */

/* … */

/* Отвечать по одной строке за один раз. На данном этапе удобно использовать функции библиотеки С для работы со строками. */

fp = _tfopen(pThArg->TmpFileName, _T("r"));

Response.Status = 0;

/* Поскольку младший бит события установлен, ответные сообщения в очередь порта завершения не помещаются. */

while(_fgetts(Response.Record, MAX_RQRS_LEN, fp) != NULL) {

WriteFile(Key [KeyIndex].hNp, &Response, RS_SIZE, &nXfer, &ovResp);

WaitForSingleObject(hWrEvent, INFINITE);

}

fclose(fp);

/* Уничтожить содержимое временного файла. */

SetFilePointer(hTmpFile, 0, NULL, FILE_BEGIN);

SetEndOfFile(hTmpFile);

/* Отправить признак конца ответа. */

Response.Status = 1;

strcpy(Response.Record, "");

WriteFile(Key[KeyIndex].hNp, &Response, RS_SIZE, &nXfer, &ovResp);

WaitForSingleObject(hWrEvent, INFINITE);

/* Конец основного командного цикла. Получить следующую команду.*/

Disconnect = !ReadFile(Key[KeyIndex].hNp, &Key[KeyIndex].Req, RQ_SIZE, &nXfer, &Key[KeyIndex].Ov) && GetLastError() == ERROR_HANDLE_EOF; /* Следующее чтение */

if (Disconnect) continue;

Success = TRUE;

}

} __finally {

if (Disconnect) {

/* Создать еще одно соединение по этому каналу. */

Key[KeyIndex].Type = 0;

DisconnectNamedPipe(Key[KeyIndex].hNp);

ConnectNamedPipe(Key[KeyIndex].hNp, &Key[KeyIndex].Ov);

}

if (!Success) {

ReportError(_T("Ошибка сервера"), 0, TRUE);

Exit = TRUE;

}

}

FlushFileBuffers(Key[KeyIndex].hNp);

DisconnectNamedPipe(Key[KeyIndex].hNp);

CloseHandle(hTmpFile);

/* … */

_endthreadex(0);

return 0;

/* Подавление предупреждающих сообщений компилятора. */

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

Интервал:

Закладка:

Сделать

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

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


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

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

x