Помощь в написании студенческих работ
Антистрессовый сервис

Исследование механизмов межпроцессного взаимодействия

Курсовая Купить готовую Узнать стоимостьмоей работы

Получить класс приоритета потока (связан с уровнем приоритета). Поле «long int tpDeltaPri» которой представляет собой дельта-приоривев,. Главная функция потока, обслуживающего клиентские подключения. Cout << «ErrExit, Невозможно сменить режим работы второго канала» << endl; Записываем в канал результат обработки клиентского запроса. Записываем в канал результат обработки клиентского запроса. В. И… Читать ещё >

Исследование механизмов межпроцессного взаимодействия (реферат, курсовая, диплом, контрольная)

Содержание

  • Задание на курсовую работу
  • Введение, цели и задачи курсовой работы
  • 1. Постановка задачи и теоретические основы
    • 1. 1. Требования и основания
    • 1. 2. Порядок выполнения курсовой работы
    • 1. 3. Использование функций получения системной информации (работа первого сервера)
    • 1. 4. Использование функций при работе с процессами и потоками (работа второго сервера)
    • 1. 5. Использование системных средств синхронизации процессов
    • 1. 6. Использование средств передачи данных между процессами
    • 1. 7. Использование механизмов межпроцессного взаимодействия
  • 2. Описание программ и запуск
  • приложений
    • 2. 1. Результат работы программы (PrintScreen после запуска приложе-ния)
  • Заключение
  • 4. Список использованной литературы
  • Приложение 1

hPipe = (HANDLE) lpvParam;

while (1).

{ // Считываем из канала запросы клиентов.

fSuccess = ReadFile (.

hPipe, // дескриптор канала.

chRequest, // буфер для получения данных.

BUFSIZE, // указываем размер буфера.

&cbBytesRead, // запоминаем количество считанных байт.

NULL); // синхронный режим ввода-вывода.

// Обрабатываем запрос если он корректен.

if (! fSuccess — cbBytesRead == 0).

break;

GetAnswerToRequest ((char *)&chReply, &cbReplyBytes);

// Записываем в канал результат обработки клиентского запроса.

fSuccess = WriteFile (.

hPipe, // дескриптор канала.

chReply, // буфер с данными для передачи.

cbReplyBytes, // количество байт для передачи.

&cbWritten, // запоминаем количество записанных в канал байт.

NULL); // синхронный режим ввода-вывода.

if (! fSuccess — cbReplyBytes ≠ cbWritten) break;

}.

// Записываем содержимое буферов в канал, чтобы позволить клиенту считать.

// остаток информации перед отключением. Затем выполним отсоединение от.

// канала и уничтожаем дескриптор этого экземпляра канала.

FlushFileBuffers (hPipe);

DisconnectNamedPipe (hPipe);

CloseHandle (hPipe);

}.

//—————————————————————————————————————;

Сервер 2:

//—————————————————————————————————————-;

//Borland C ЕМ.

//Copyright © 2018. All Rights Reserved.

//—————————————————————————————————————-;

// Interprocess Communication.

//—————————————————————————————————————;

#include <vcl.h>

#pragma hdrstop.

#pragma argsused.

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

#include <tlhelp32.h>

#include <psapi.h>

#include «PriorConsole.h» .

using namespace std;

#define BUFSIZE 10 000 // Размер буфера отправки и приема.

#define PIPE_TIMEOUT 10 000 // Время ожидания клиента.

VOID InstanceThread (LPVOID);

HANDLE WINAPI CreateToolhelp32Snapshot (DWORD dwFlags, DWORD th32ProcessID);

int xx = 0;

DWORD start;

CHAR chReply[BUFSIZE];

HANDLE hThread;

typedef struct.

{ int ThreadPrior;

DWORD ClassPrior;

DWORD ClassPriorClient;

long int BasePri;

long int DeltaPri;

}stReply;

//—————————————————————————————————————;

int main (int argc, char* argv[]){.

//Многопоточный сервер каналов, cинхронный режим работы.

BOOL fConnected;

DWORD dwThreadId;

HANDLE hPipe;

LPTSTR lpszPipename = «\\.\pipe\mynamedpipe2» ;

start = GetTickCount (); // program start tick.

// Главный цикл создает экземпляр именованного канала и затем ожидает подключение.

// клиентов к нему. Когда происходит подключение, создается поток, производящий.

// обмен данными с клиентом, а выполнение главного цикла продолжается.

for (;;).

{ hPipe = CreateNamedPipe (.

lpszPipename, // Имя канала.

PIPE_ACCESS_DUPLEX, // Дуплексный доступ к каналу.

PIPE_TYPE_MESSAGE — // Установка режима работы канала.

PIPE_READMODE_MESSAGE — // для передачи по нему отдельных сообщений.

PIPE_WAIT, // Синхронное выполнение операций с каналом.

PIPE_UNLIMITED_INSTANCES, // Неограниченное количество экземпляров.

BUFSIZE, // Размер буфера отправки.

BUFSIZE, // Размер буфера приема.

PIPE_TIMEOUT, // Время ожидания клиента.

NULL); // Без дополнительных атрибутов безопасности.

if (hPipe == INVALID_HANDLE_VALUE).

{ cout << «ErrExit, Экземпляр именованного канала не создан» << endl;

return -1;

}.

cout << lpszPipename << «- pipe is setup, waiting for client request» << endl;

// Ждем, пока не подсоединится клиент; в случае успешного подключения,.

// Функция возвращает ненулевое значение. Если функция вернет ноль,.

// то GetLastError вернет значение ERROR_PIPE_CONNECTED.

fConnected = ConnectNamedPipe (hPipe, NULL) ?

TRUE: (GetLastError () == ERROR_PIPE_CONNECTED);

if (fConnected).

{ // Создаем поток для обслуживания клиента.

hThread = CreateThread (.

NULL, // без атрибутов безопасности.

0, // размер стека по умолчанию.

(LPTHREAD_START_ROUTINE) InstanceThread,.

(LPVOID) hPipe, // параметр потока — дескриптор канала.

0, // без отложенного запуска.

&dwThreadId); // возвращает дескриптор потока.

if (hThread == NULL).

{ cout << «ErrExit, Создание потока произошло с ошибками» << endl;

return -2;

}.

else.

CloseHandle (hThread);

}.

else.

// Если клиент не смог подсоединиться, то уничтожаем экземпляр канала.

CloseHandle (hPipe);

}.

return 0;

}.

//—————————————————————————————————————;

unsigned long PIDByName (AnsiString AProcessName).

{HANDLE hProcessSnap;

PROCESSENTRY32 ProcessEntry32;

unsigned long pid;

//long BasePri;

bool Loop;

hProcessSnap = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);

ProcessEntry32.dwSize = sizeof (PROCESSENTRY32);

Loop = Process32First (hProcessSnap, &ProcessEntry32);

while (Loop).

{if (strcmp (ProcessEntry32.szExeFile, AProcessName. c_str ()) == 0).

{.

pid = ProcessEntry32. th32ProcessID;

//BasePri = ProcessEntry32. pcPriClassBase;

CloseHandle (hProcessSnap);

return pid;

}.

Loop = Process32Next (hProcessSnap, &ProcessEntry32);

}.

CloseHandle (hProcessSnap);

return 0;

}.

//—————————————————————————————————————;

bool PrioByPID (DWORD pid, stReply *Reply).

{HANDLE hThreadSnap;

THREADENTRY32 ThreadEntry32;

bool Loop;

hThreadSnap = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);

ThreadEntry32.dwSize = sizeof (THREADENTRY32);

Loop = Thread32First (hThreadSnap, &ThreadEntry32);

while (Loop).

{if (ThreadEntry32.th32OwnerProcessID == pid).

{.

//Reply->tid = ThreadEntry32. th32ThreadID;

Reply->BasePri = ThreadEntry32. tpBasePri;

Reply->DeltaPri = ThreadEntry32. tpDeltaPri;

CloseHandle (hThreadSnap);

return 1;

}.

Loop = Thread32Next (hThreadSnap, &ThreadEntry32);

}.

CloseHandle (hThreadSnap);

return 0;

}.

//—————————————————————————————————————;

// Return: ThreadPrior, ClassPrior.

GetAnswerToRequest (HANDLE hPipe, char *chReply, unsigned long *pReplyBytes).

{ stReply *Reply;

Reply = (stReply *)chReply;

//Получить уровень приоритета процесса.

Reply->ThreadPrior=GetThreadPriority (GetCurrentThread ());//параметр-дескриптор потока.

cout << Reply->ThreadPrior << endl; //Specifies the priority level.

*pReplyBytes = 4; //long int = 4 BYTES.

//Получить класс приоритета потока (связан с уровнем приоритета).

Reply->ClassPrior = GetPriorityClass (GetCurrentProcess ()); //параметр — handle of process.

cout << Reply->ClassPrior << endl; //Specifies the class of priority.

*pReplyBytes += 4; //DWORD = 4 BYTES.

//Получить класс приоритета процесса клиента.

// с помощью CreateToolhelp32Snapshot (), Process32First (), Process32Next ().

unsigned long pid = PIDByName («InOutConsole.exe»);

Reply->ClassPriorClient = GetPriorityClass ((HANDLE)pid); //параметр — ID процесса.

cout << Reply->ClassPriorClient << endl; //Specifies the priority level.

*pReplyBytes += 4; //DWORD = 4 BYTES.

//Получить списки потоков процесса для заполнения записи TThreadEntry32,.

// поле «long int tpDeltaPri» которой представляет собой дельта-приоривев,.

// в.И. величину отличия реального приоритета от значения tpBasePri.

// с помощью CreateToolhelp32Snapshot (), Thread32First (), Thread32Next ().

PrioByPID (pid, Reply);

cout << Reply->BasePri << endl; //Specifies the Base Priority.

*pReplyBytes += 4; //long int = 4 BYTES.

cout << Reply->DeltaPri << endl; //Specifies the Delta Priority.

*pReplyBytes += 4; //long int = 4 BYTES.

cout << «.

— This message will be transmit to client" << endl;

}.

//—————————————————————————————————————;

// Главная функция потока, обслуживающего клиентские подключения.

VOID InstanceThread (LPVOID lpvParam).

{ CHAR chRequest[BUFSIZE];

DWORD cbBytesRead, cbReplyBytes, cbWritten;

BOOL fSuccess;

HANDLE hPipe;

// Переданный потоку параметр интерпретируем как дескриптор канала.

hPipe = (HANDLE) lpvParam;

while (1).

{ // Считываем из канала запросы клиентов.

fSuccess = ReadFile (.

hPipe, // дескриптор канала.

chRequest, // буфер для получения данных.

BUFSIZE, // указываем размер буфера.

&cbBytesRead, // запоминаем количество считанных байт.

NULL); // синхронный режим ввода-вывода.

// Обрабатываем запрос если он корректен.

if (! fSuccess — cbBytesRead == 0).

break;

GetAnswerToRequest (hPipe,(char *)&chReply, &cbReplyBytes);

// Записываем в канал результат обработки клиентского запроса.

fSuccess = WriteFile (.

hPipe, // дескриптор канала.

chReply, // буфер с данными для передачи.

cbReplyBytes, // количество байт для передачи.

&cbWritten, // запоминаем количество записанных в канал байт.

NULL); // синхронный режим ввода-вывода.

if (! fSuccess — cbReplyBytes ≠ cbWritten) break;

}.

// Записываем содержимое буферов в канал, чтобы позволить клиенту считать.

// остаток информации перед отключением. Затем выполним отсоединение от.

// канала и уничтожаем дескриптор этого экземпляра канала.

FlushFileBuffers (hPipe);

DisconnectNamedPipe (hPipe);

CloseHandle (hPipe);

}.

//—————————————————————————————————————;

Клиент:

//—————————————————————————————————————-;

//Borland C ЕМ.

//Copyright © 2018. All Rights Reserved.

//—————————————————————————————————————-;

// Interprocess Communication.

//—————————————————————————————————————;

#pragma hdrstop.

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

#include «ClientConsole.h» .

#pragma package (smart_init).

using namespace std;

#define BUFSIZE 512 // Размер буфера.

typedef struct.

{ SYSTEMTIME sm;

DWORD tick;

}stReply;

typedef struct.

{ int ThreadPrior;

DWORD ClassPrior;

DWORD ClassPriorClient;

long int BasePri;

long int DeltaPri;

}stReply2;

//—————————————————————————————————————;

//Клиент каналов, cинхронный режим работы.

DWORD main (int argc, char *argv[]).

{ HANDLE hPipe;

LPVOID lpvMessage;

CHAR chBuf[512];

BOOL fSuccess;

DWORD cbRead, cbWritten, dwMode;

LPTSTR lpszPipename = «\\.\pipe\mynamedpipe» ;

LPTSTR lpszPipename2 = «\\.\pipe\mynamedpipe2» ;

while (1) // цикл поочередного открытия 2-я именованныя каналов.

{.

// Пытаемся открытщ именованный канал; если необходимо, то подождем.

while (1).

{ hPipe = CreateFile (.

lpszPipename, // имя канала.

GENERIC_READ — // доступ на чтение и запись данных.

GENERIC_WRITE,.

0, // без разделения доступа.

NULL, // без дополнительных атрибутов безопасности.

OPEN_EXISTING, // открываем существующий канал.

0, // задаем атрибуты по умолчанию.

NULL); // без файла шаблона.

// Если подключение успешно, то выходим из цикла ожидания.

if (hPipe ≠ INVALID_HANDLE_VALUE).

break;

// Если возникает ошибка отличная от ERROR_PIPE_BUSY, то прекращаем работу.

if (GetLastError () ≠ ERROR_PIPE_BUSY).

{ cout << «ErrExit, Не могу открыть канал» << endl;

return -1;

}.

// Ждем 20 секунд до повторного подключения.

if (! WaitNamedPipe (lpszPipename, 20 000)).

{ cout << «ErrExit, Не могу открыть канал» << endl;

return -1;

}.

}.

cout << lpszPipename << «- pipe of server 1 is succesfully ON» << endl;

// Канал подключен успешно; сменим режим работы канала на чтение/запись сообщений.

dwMode = PIPE_READMODE_MESSAGE;

fSuccess = SetNamedPipeHandleState (.

hPipe, // дескриптор канала.

&dwMode, // новый режим работы.

NULL, // не устанавливаем максимальный размер

NULL); // не устанавливаем максимальное время.

if (!fSuccess).

{ cout << «ErrExit, Невозможно сменить режим работы канала» << endl;

return -2;

}.

// Отправляем сообщения серверу.

lpvMessage = (argc > 1)? argv[1]: «default message» ;

fSuccess = WriteFile (.

hPipe, // дескриптор канала.

lpvMessage, // сообщение.

strlen ((const char *)lpvMessage) + 1, // длина сообщения.

&cbWritten, // количество записанных в канал байт.

NULL); // синхронный ввод/вывод.

if (! fSuccess).

{ cout << «ErrExit, Запись сообщения в канал не удалась» << endl;

return -3;

}.

cout << «Default message to server 1 is send» << endl;

do.

{ // Считываем сообщения из канала.

fSuccess = ReadFile (.

hPipe, // дескриптор канала.

chBuf, // буфер для получения ответа.

BUFSIZE, // размер буфера.

&cbRead, // количество считанных из канала байт.

NULL); // синхронный ввод/вывод.

if (! fSuccess && GetLastError () ≠ ERROR_MORE_DATA).

break;

// Следующий код — код обработки ответа сервера 1.

// В данном случае просто выводим сообщение на STDOUT.

stReply *Reply;

Reply = (stReply *)chBuf;

cout << Reply->sm.wYear << endl; //Specifies the current year.

cout << Reply->sm.wMonth << endl; //Specifies the current month; Jan = 1, Feb = 2, …

cout<<Reply->sm.wDayOfWeek<<endl;//Spec the current day of week; Sun=0, Mon=1, …

cout << Reply->sm.wDay << endl; //Specifies the current day of the month.

cout << Reply->sm.wHour << endl; //Specifies the current hour.

cout << Reply->sm.wMinute << endl; //Specifies the current minute.

cout << Reply->sm.wSecond << endl; //Specifies the current second.

cout << Reply->sm.wMilliseconds << endl; //Specifies the current millisecond.

cout << Reply->tick << endl;

} while (! fSuccess); // если ERROR_MORE_DATA (еще остались данные),.

// то повторяем считывание из канала.

cout << «.

— This message received from server 1″ << endl;

// Закрываем канал.

CloseHandle (hPipe);

//—————————————————————————————————————;

// Пытаемся открыть второй именованный канал; если необходимо, то подождем.

while (1).

{ hPipe = CreateFile (.

lpszPipename2, // имя второго канала.

GENERIC_READ — // доступ на чтение и запись данных.

GENERIC_WRITE,.

0, // без разделения доступа.

NULL, // без дополнительных атрибутов безопасности.

OPEN_EXISTING, // открываем существующий канал.

0, // задаем атрибуты по умолчанию.

NULL); // без файла шаблона.

// Если подключение успешно, то выходим из цикла ожидания.

if (hPipe ≠ INVALID_HANDLE_VALUE).

break;

// Если возникает ошибка отличная от ERROR_PIPE_BUSY, то прекращаем работу.

if (GetLastError () ≠ ERROR_PIPE_BUSY).

{ cout << «ErrExit, Не могу открыть второй канал» << endl;

return -1;

}.

// Ждем 20 секунд до повторного подключения.

if (! WaitNamedPipe (lpszPipename2, 20 000)).

{ cout << «ErrExit, Не могу открыть второй канал» << endl;

return -1;

}.

}.

cout << lpszPipename2 << «- second pipe of server 2 is succesfully ON» << endl;

// 2-й канал подключен успешно; смена режима работы на чтение/запись сообщений.

dwMode = PIPE_READMODE_MESSAGE;

fSuccess = SetNamedPipeHandleState (.

hPipe, // дескриптор канала.

&dwMode, // новый режим работы.

NULL, // не устанавливаем максимальный размер

NULL); // не устанавливаем максимальное время.

if (!fSuccess).

{ cout << «ErrExit, Невозможно сменить режим работы второго канала» << endl;

return -2;

}.

// Отправляем сообщения второму серверу.

lpvMessage = (argc > 1)? argv[1]: «default message» ;

fSuccess = WriteFile (.

hPipe, // дескриптор канала.

lpvMessage, // сообщение.

strlen ((const char *)lpvMessage) + 1, // длина сообщения.

&cbWritten, // количество записанных в канал байт.

NULL); // синхронный ввод/вывод.

if (! fSuccess).

{ cout << «ErrExit, Запись сообщения в канал не удалась» << endl;

return -3;

}.

cout << «Default message to server 2 is send» << endl;

do.

{ // Считываем сообщения из второго канала.

fSuccess = ReadFile (.

hPipe, // дескриптор канала.

chBuf, // буфер для получения ответа.

BUFSIZE, // размер буфера.

&cbRead, // количество считанных из канала байт.

NULL); // синхронный ввод/вывод.

if (! fSuccess && GetLastError () ≠ ERROR_MORE_DATA).

break;

// Следующий код — код обработки ответа сервера 2.

// В данном случае просто выводим сообщение на STDOUT.

stReply2 *Reply;

Reply = (stReply2 *)chBuf;

cout << Reply->ThreadPrior << endl; //Specifies the priority level.

cout << Reply->ClassPrior << endl; //Specifies the class of priority.

cout << Reply->ClassPriorClient << endl; //Specifies the priority class of Client process.

cout << Reply->BasePri << endl; //Specifies the base priority.

cout << Reply->DeltaPri << endl; //Specifies the delta priority.

} while (! fSuccess); // если ERROR_MORE_DATA (еще остались данные),.

// то повторяем считывание из канала.

cout << «.

— This message received from server 2″ << endl;

// Закрываем канал.

CloseHandle (hPipe);

//—————————————————————————————————————;

}.

return 0;

}.

//—————————————————————————————————————;

Показать весь текст

Список литературы

  1. Основная:
  2. В.Г.Олифер, Н. А. Олифер. Сетевые операционные системы. — СПб.: Питер, 2009
  3. Э.Таненбаум. Современные операционные системы. 3-изд. — СПб.: Питер, 2011
  4. М. Руссинович, Д. Соломон. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. — СПб.: Питер, 2008
  5. Джеффри Рихтер, Кристоф Назар. Windows via C/C++. -M.:Издательство «Русская редакция»; СПб.: Питер, 2009
  6. http://msdn.microsoft.com
  7. Л. Басс, П. Клементс, Р. Кацман. Архитектура программного обеспечения на прак-тике. СПб.: Питер", 2006 г.
  8. http://ru.wikipedia.org/wiki/Клиент-сервер
  9. http://mkiit.mtuci-study.ru/operating-systems
  10. Дополнительная:
  11. Джеффри Рихтер. Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows. — Питер, Русская редакция, 2001
  12. Э.Таненбаум, А.Вудхалл. Операционные системы. Разработка и реализация. — Пи-тер, 2007
  13. В.О. Основы современные операционных систем — М.: Национальный Открытый Университет «ИНТУИТ»: БИНОМ. Лаборатория знаний, 2011
  14. Ю.Ф., Яковлев Ал.В., Яковлев Ан.В. Операционные системы. Кон-цепции построения и обеспечения безопасности. — М.: Горячая линия — Телеком, 2011
  15. Х.М.Дейтел, П.Дж.Дейтел, Д. Р. Чофес. Операционные системы.- М.: Изд. Бином, 2009
  16. Д.В.Иртегов. Введение в операционные системы. СПб.: БВХ-Петербург, 2008
  17. С.В.Назаров. Операционные среды, системы и оболочки. Основы структурной и функциональной организации: Учебное пособие. — М.: КУДИЦ-ПРЕСС, 2007
  18. К.А.Коньков. Устройство и функционирование ОС Windows. Практикум по курсу «Операционные системы»: учебное пособие. М.: Интернет-Университет Инфор-мационных технологий; БИНОМ. Лаборатория знаний, 2008.
  19. http://www.intuit.ru/department/internet/mwebtech/5/
  20. В.Коржов. Многоуровневые системы клиент-сервер. М.: Открытые системы. Сети, 1997, № 6.
Заполнить форму текущей работой
Купить готовую работу

ИЛИ