Межпроцессорное взаимодействие. Передача информации в MS Windows 2000-2003. Анонимные каналы. Почтовые ящики. Функции WIN 32 API. — КиберПедия 

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Межпроцессорное взаимодействие. Передача информации в MS Windows 2000-2003. Анонимные каналы. Почтовые ящики. Функции WIN 32 API.

2017-11-16 238
Межпроцессорное взаимодействие. Передача информации в MS Windows 2000-2003. Анонимные каналы. Почтовые ящики. Функции WIN 32 API. 0.00 из 5.00 0 оценок
Заказать работу

 

Анонимные каналы

· Анонимные каналы не имеют имен.

· Не пригодны для обмена через сеть.

· Главная цель – служить каналом между родительским и дочерним процессом или между дочерними процессами.

· Односторонний обмен.

· Не возможен асинхронный обмен.

 

 

Канал представляет собой псевдофайл с органзацией типа буфера FIFO (first input and first output - первый вошел, первый вышел). Образно говоря, канал представляет собой трубу (pipe) с двумя открытыми концами, в который один процесс пишет, а другой читает.

 

Использование анонимных каналов

 

Главная цель – служить каналом между родительским и дочерним процессом или между дочерними процессами. Родительский пpоцесс может быть консольным или GUI-пpиложение, но дочернее приложение должно быть консольным. Как вы знаете, консольное приложение использует стандартные дескрипторы для ввода и вывода. Если мы хотите пеpенапpавить ввод/вывод консольного приложения, мы можем заменить один дескриптор другим дескриптором одного конца канала. Консольное приложение не будет знать, что оно использует один конец канала. Оно будет считать, что это стандартный дескриптор. Это вид полимоpфизма на ООП-жаpгоне. Это мощный подход, так как нам не нужно модифицировать родительский процесс ни каким образом.

 

Создание анонимных каналов

 

BOOL CreatePipe(

LPHANDLE hReadPipe,

LPHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes,

DWORD nSize

);

 

· ReadFile – чтение из канала

· WriteFile – запись в канал

· pReadHandle - это указатель на переменную типа dword, которая получит дескриптов конца чтения канала.

· pWriteHandle - это указатель на переменную типа dword, которая получить дескриптов конца записи канала.

· pPipeAttributes указывает на стpуктуpу SECURITY_ATTRIBUTES, котоpая опpеделяет, наследуется ли каждый из концов дочерним процессом.

· nBufferSize - это предполагаемый pазмеp буфера, который канал заpезеpвиpует для использования. Это всего лишь предполагаемый pазмеp. Вы можете пеpедать NULL, чтобы указать функции использовать pазмеp по умолчанию.

Не забудьте установить паpаметp bInheritable стpуктуpы SECURITY_ATTRIBUTES в TRUE, чтобы дескриптры могли наследоваться.

 

Пример использования анонимного канала

Создаем анонимный канал с помощью CreatePipe. Теперь мы должны подготовить параметры, которые передадим CreateProcess (мы используем эту функцию для загрузки консольного приложения). Вызоваем CreateProcess, чтобы загрузить дочернее приложение. После того, как вызов прошел успешно, дочерний процесс все еще находится в спящем состоянии. Он загружается в память, но не запускается немедленно. Закройте дескриптор записи канала. Это необходимо, так как родительскому процессу нет нужды использовать этот дескриптор, а канал не будет работать, если открыть более чем один дескриптор записи. Теперь вы можете читать данные с помощью ReadFile. Вы должны последовательно вызывать ReadFile, пока она не возвратит ноль, что будет означать, что больше данных нет. Закроем дескриптор чтения канала.

 


Межпроцессорное взаимодействие. Передача информации в MS Windows 2000-2003. Именованные каналы. Почтовые ящики. Функции WIN 32 API.

 

 

Взаимодействие между процессами (IPC)

1. DDE (Dynamic Data Exchange),

2. OLE,

3. atom (атомы)

4. pipes (анонимные каналы),

5. named pipes (именованные каналы)

6. почтовые ящики (mailslots)

7. RPC

8. сокеты

9. файлы, проецируемые в память (memory-mapped files)

10. разделяемая память (Shared Memory). Отличается от предыдущего способа только тем, что в качестве разделяемого файла используется часть файла подкачки.

 

Сообщения WM_COPYDATA Лучший способ пересылки блока данных из одной программы в другую.
Анонимные каналы (Anonymous pipes) Полезны для организации прямой связи между двумя процессами на одном ПК.
Именованные каналы (Named pipes) Полезны для организации прямой связи между двумя процессами на одном ПК или в сети.
Почтовые ячейки (mailslots) Полезны для организации связи одного процесса со многими на одном ПК или в сети.
Гнезда (sockets) Полезны для организации пересылки данных в гетерогенных средах.
Вызов удаленных процедур RPC Слишком сложен, чтобы использовать его для простых пересылок данных.
Разделяемая память Непросто выделить вне DLL.
Файлы отображаемой памяти Обеспечивают одновременный доступ к объектам файла отображения из нескольких процессов.

 

Атомы это очень простой и доступный путь IPC. Идея состоит в том, что процесс может поместить строку в таблицу атомов и эта строка будет видна другим процессам. Когда процесс помещает строку в таблицу атомов, он получает 32-х битное значение (атом), и это значение используется для доступа к строке. Система не различает регистр строки. Набор атомов собирается в таблицу (atom table). Система обеспечивает несколько таблиц атомов для разных задач.

 

По типу доступа их два типа:

· Локальные (доступны только из приложения)

· Глобальные (доступны из всех приложений)

 

Функции WIN 32 API для атомов

· GlobalAddAtom

· GlobalGetAtomName

· GlobalFindAtom

· GlobalDeleteAtom

 

Сообщение WM_COPYDATA

Отправитель:

COPYDATASTRUCT cds;

cds.cbData = (DWORD) nSize;

cds.lpData = (PVOID) pBuffer;

SendMessage (hWndTarget, WM_COPYDATA, (WPARAM) hWnd, (LPARAM) &cds);

Получатель:

PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT) lParam;

PBYTE pBuffer = (PBYTE) pcds -> lpData;

 

Сообщение WM_COPYDATA позволяет приложениям копировать данные между их адресными пространствами. При этом приложения не обязательно должны быть 32-разрядными — для 16-разрядных приложений поддерживается автоматическая трансляция указателей. Перед отправкой сообщения WM_COPYDATA необходимо инициализировать структуру COPYDATASTRUCT с информацией о предстоящей пересылке данных, в том числе с указателем на блок данных. Затем с помощью функции SendMessage сообщение WM_COPYDATA пересылается в принимающую программу; при этом параметр wParam содержит дескриптор окна вашей программы, а lParam - адрес структуры COPYDATASTRUCT. Когда сообщение поступает обработчику WM_COPYDATA принимающей программы, его средствами указатель может быть скопирован из структуры COPYDATASTRUCT и использован, как любой другой указатель. В принимающем процессе размер блока данных, адрес которого содержит lpData, извлекается из элемента cbData. Значение, считываемое из элемента lpData принимающей программой, возможно, будет отличаться от значения, помещенного туда отправляющей программой. Этого следовало ожидать, поскольку перед передачей сообщения WM_COPYDATA операционная система Windows NT выделяет в адресном пространстве принимающего процесса блок памяти, копирует данные из отправляющего процесса и обновляет значение lpData. По всей вероятности, в адресных пространствах этих процессов адреса размещении блока не совпадут. В структуре COPYDATASTRUCT имеется третье, необязательное поле, dwData, в котором можно передать 32-разрядное значение, определяемое в программе. Только не передавайте в этом поле указатель, потому что в принимающем процессе он не будет воспринят. При использовании метода WM_COPYDATA необходимо помнить об одной детали: сообщения должны именно пересылаться, а не просто регистрироваться. Для того чтобы освободить память, выделенную в адресном пространстве принимающего процесса, операционная система должна быть информирована о моменте завершении пересылки. Кроме того, получатель сообщения WM_COPYDATA должен обращаться с блоком данных так, словно он предназначен только для чтения. Чтобы внести изменении в полученные данные, в принимающей программе необходимо подготовить их локальную копию. И наконец, не следует сохранять указатель, переданный в элементе lpData, дл применения его в дальнейшем.

 

 


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.