Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поделить хэндл между процессами 
:(
    Опции темы
leniviy
Дата 15.12.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Привет. Задача такая. Нужно хэндл произвольного типа (доступный для DuplicateHandle(): пайп, файл, событие, HPROCESS...) поделить между процессами. 
Зарегистрировать его под уникальным именем, а другой процесс зная это имя может получить валидный для себя хэндл того же объекта. Как можно это сделать? COM Server использовать нельзя. Может есть простой способ? Или есть готовая реализация?

Есть мысль с помощью MapViewOfFile(Filename:= NULL) выделить именованный блок виртуальной памяти, и в него писать таблицу 
struct {
 SomeProcessInfo pifo;
 HANDLE hndl;
}[];
С помощью мутексов синхронизировать доступ к этой таблице из разных процессов.
Когда процесс впервые получает хэндл из этой таблицы, он сам записывает в неё информацию о себе, так что если первый процесс (тот, кто создал объект) завершается, объект остаётся доступным. А когда все процессы завершаются, система освобождает таблицу и хэндлы из неё.

PM MAIL   Вверх
GremlinProg
Дата 22.12.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

leniviy, я правильно понял вопрос?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
leniviy
Дата 22.12.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



да. Нужен способ , когда оба процесса знают имя.
PM MAIL   Вверх
GremlinProg
Дата 22.12.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Способов, в принципе множество, FileMapping - один из них, и вполне преемлемый

Если не хочешь FileMapping, то можно использовать посылку оконных сообщений между процессам (конечно, в случае, когда приложения оконные), RegisterWindowMessage гарантирует уникальность сообщения в таком случае

если такой возможности нет, то можно использовать общую секцию данных (мы, кстати совсем недавно обсуждали такой способ):
в случае, когда процессы отображаются из одного образа, создаешь секцию в приложении и выделяешь в ней связные переменные
Код

#pragma data_seg(".shared")
  SomeProcessInfo pifo = {};
  HANDLE hndl = NULL;
#pragma data_seg() 

которая будет доступна из всех процессов

в случае, когда образы разные - делай то же самое в какой-нибудь dll, импортируя ее в свои приложения

выбирай, что лучше подходит для твоей задачи

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

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


Это сообщение отредактировал(а) GremlinProg - 22.12.2008, 17:08


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
leniviy
Дата 1.1.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



GremlinProg, спасибо. Про #pragma data_seg(".shared") интересно.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.