Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 13

Общая память для процессов

17.02.2011, 19:05. Показов 5253. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток)
Подскажите какие есть возможные варианты выделения памяти для использования ее двумя разными процессами...

Пробовал через mapping file, но там возникает проблема с указателями
Например есть 2 структуры

typedef struct _struct2 {
int * b1; // указывает на a1
int b2;
} struct2;

typedef struct _struct1 {
int a1;
bb a2;
} struct1;

struct1 *qwerty; // указатель на mapping файл

При считывание получается, что a1, a2 и b2 - верные значения, а вот b1 указывает уже далеко не на a1...

Как вариант мне посоветовали extern "C"__declspec(dllexport), сказав что из .exe тоже можно экспортировать, но у меня что-то так и не получилось... хотя если создать общую dll для обоих процессов, тогда нормально получаю указатель на нужную структуру обоими процессами.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2011, 19:05
Ответы с готовыми решениями:

Multiprocessing.Pool - общая для всех дочерних процессов переменная (список)
День добрый! Имеется пул процессов, который отлично работает, но хотелось бы сделать так, чтобы все эти процессы могли смотреть в одну и...

Общая оперативная память для серверов
Разрабатываю приложение, которое будет крутиться на сервере, соответственно есть вероятность того что приложение станет популярным и одним...

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

6
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.02.2011, 19:09
Цитата Сообщение от AriesMan Посмотреть сообщение
При считывание получается, что a1, a2 и b2 - верные значения, а вот b1 указывает уже далеко не на a1...
а на что собсно указывает a1?
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 13
17.02.2011, 19:20  [ТС]
Цитата Сообщение от alex_x_x Посмотреть сообщение
а на что собсно указывает a1?
a1 - тупо некоторое число, а b1 - указатель на него...(это в данном примере, на самом деле структуры куда сложнее)

Создаем файл и заполняем
Code
1
2
3
4
5
6
7
8
...
HANDLE map = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(struct1), mapName);
if(map == NULL) return 0;
struct1 *st1 = (struct1 *)MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(struct1));
st1->a1 = 1;
st1->a2.b1 = st1->a1;
st1->a2.b2 = 2;
...
Получаем
Code
1
2
3
4
5
...
HANDLE map = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapName); 
if(map == NULL) return 0;
struct1 *st2 = (struct1 *)MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(struct1));
...
В st2 - значения параметров верные, но только st2->a2.b1 не указывает на st2->a1
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.02.2011, 19:32
AriesMan, так вы подумайте над тем какие адреса вам возвращают
struct1 *st1 фактически адрес начиная с которого в виртуальную память смонтировали файл
struct1 *st2 другой адрес с которого в виртуальную память смонтировали файл
в разных процессах файл смонтирован на разные адреса
поэтому st1->a2.b1 будет указывать на другой адрес
простое решение - попробуйте монтировать в обоих процессах по одному адресу
в MapViewOfFileEx lpBaseAddress
естественно должны быть незанятые регионы

насчет указателей в разных процессах в любом случае будут сложности
1
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 13
17.02.2011, 19:41  [ТС]
Спасибо, в принципи так и думал, что связано с точкой монтирования)
осталось придумать, как бы выбрать постоянный lpBaseAddress, чтоб он свободным был...

Ну кстати при extern "C"__declspec(dllexport) из дллки никаких проблем с адресацией нет))

Только не понятно возможно ли все таки как-то экспортировать из экзешника и получить в другом процессе?

А еще мб какие-то вариант есть что-то типо shared memory?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.02.2011, 19:53
Цитата Сообщение от AriesMan Посмотреть сообщение
Ну кстати при extern "C"__declspec(dllexport) из дллки никаких проблем с адресацией нет))
это еще надо подумать почему нет, на досуге
Цитата Сообщение от AriesMan Посмотреть сообщение
осталось придумать, как бы выбрать постоянный lpBaseAddress, чтоб он свободным был...
ну можно открыть рихтера, у него есть описании пространства адресов, но конечно сложно
Цитата Сообщение от AriesMan Посмотреть сообщение
А еще мб какие-то вариант есть что-то типо shared memory?
какойнибудь COM-сервер раздающий память
на самом деле узнаете - расскажите

Добавлено через 3 минуты
на самом деле самое лучшее это попытаться избежать указателей, если это возможно
0
0 / 0 / 0
Регистрация: 22.01.2011
Сообщений: 13
18.02.2011, 01:03  [ТС]
Вообщем вопрос решился через мэппинг заменой указателей на смещение относительно адреса struct1.

Правда доступ немного неудобный стал... Но зато получилось именно то, как я и представлял, как должно работать))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2011, 01:03
Помогаю со студенческими работами здесь

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

Общая память драйвера и приложения
Здравствуйте. Скажите, есть ли возможность организовать взаимодействие между драйвером и user-приложением (передача массивов данных,...

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

Виртуальая память процессов
Не могу понять о какой памяти говориться при прочтении строк типа "Как уже было сказано выше, в UNIX реализована виртуальная память...

Очистить память от неотвечающих процессов
очищать память от “не отвечающих” процессов и записывать в файл протокол их имена (или идентификаторы) Не очень понимаю,как это сделать=(...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru