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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание раздляемой области памяти dll 
V
    Опции темы
nmn
Дата 24.4.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



здравствуйте

пытаюсь создать разделяемую секцию у dll

dll.cpp
Код

#pragma data_seg(".mydata")
int SharedArray[100];
#pragma data_seg()
#pragma comment(linker, "/section:.mydata,rws")


dll.h
Код

extern DLL_API int SharedArray[100];


process1.cpp
Код

int *sa=SharedArray;
    sa[0]=123;
    cout<<"process1"<<endl;
    cout<<"sa[0]="<<sa[0]<<endl;
    cout<<"sa[1]="<<sa[1]<<endl;
    WinExec("process2.exe",0);


process2.cpp
Код

int *sa=SharedArray;
    sa[1]=123;
    cout<<"process2"<<endl;
    cout<<"sa[0]="<<sa[0]<<endl;
    cout<<"sa[1]="<<sa[1]<<endl;


и вывод:
Код

process1
sa[0]=123
sa[1]=0
process2
sa[0]=0
sa[1]=123


почему не работает?
PM Skype   Вверх
GoldFinch
Дата 24.4.2010, 01:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



проверьте длл, действительно ли там есть секция .mydata с флагом shared

Добавлено через 1 минуту и 12 секунд
алсо если после  WinExec("process2.exe",0); ничего нет, то длл благополучно выгрузится а потом загрузится.
PM MAIL ICQ   Вверх
nmn
Дата 24.4.2010, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



о, сделал int SharedArray[100]={0}; и после этого и секция создалась и начала разделяться между процессами
PM Skype   Вверх
TGrey
Дата 24.4.2010, 22:40 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну так во всех источник и так написано, что для того, что переменные были доступны, то они должны быть хоть как-то инициализированы.
PM MAIL   Вверх
nmn
Дата 25.4.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тут эти данные должны быть включены в сам файл, это увеличивает его размер, а можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать?
PM Skype   Вверх
Alexeis
Дата 25.4.2010, 10:46 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(nmn @  25.4.2010,  07:31 Найти цитируемый пост)
а можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать? 

Memory Mapping Files . Например http://forum.vingrad.ru/forum/topic-254315...file/index.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
nmn
Дата 25.4.2010, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну с MemoryMapped, понятно

а вот еще такой вопрос, что если библиотека не сможет загрузиться по своему базовому адресу, что тогда будет с разделяемой секцией?
PM Skype   Вверх
Alexeis
Дата 25.4.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(nmn @  25.4.2010,  16:30 Найти цитируемый пост)
что если библиотека не сможет загрузиться по своему базовому адресу, что тогда будет с разделяемой секцией? 

  Не должно быть проблем. Я так понимаю, что каждый образ exe хранит свое отображение виртуальных страниц на физические. Просто не нужно рассчитывать, что адреса переменных в 2х экзешниках совпадут. Физические совпадут, а то что должны совпасть виртуальные ни откуда не следует.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GoldFinch
Дата 25.4.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(nmn @  25.4.2010,  09:31 Найти цитируемый пост)
можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать? 

можно попробовать делать .obj с этой секцией компилятором который позволит сделать ее пустой
(например fasm'ом)
PM MAIL ICQ   Вверх
GremlinProg
Дата 26.4.2010, 09:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nmn @  25.4.2010,  10:31 Найти цитируемый пост)
тут эти данные должны быть включены в сам файл, это увеличивает его размер, а можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать?

nmn, в твоем примере секция mydata - это и есть та память, которая не меняет исходный размер образа,
т.к. она выделяется загрузчиком, при формировании виртуального образа в памяти

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

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


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



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



Цитата(nmn @  24.4.2010,  04:55 Найти цитируемый пост)
сделал int SharedArray[100]={0}; и после этого и секция создалась и начала разделяться между процессами 

вы использовали секцию инициализированных данных (.data) - по этому данные должны быть инициализированы.
хотя она забита нулями, она все равно занимает место на диске, это недоработка линкера

Цитата(nmn @  25.4.2010,  09:31 Найти цитируемый пост)
тут эти данные должны быть включены в сам файл, это увеличивает его размер, а можно как то сделать чтобы и память можно быть расшарить и размер файла не увеличивать? 

используйте секцию неинициализированных данных (.bss)
Код

#pragma bss_seg(".shdata")
#pragma comment(linker, "/section:.shdata,rws")
int x;
#pragma bss_seg()

такая секция не будет занимать место на диске, и данные не надо инициализировать в исходнике (они будут инициализированы нулями)

свойства этой секции будут следующие:

02 .shdata   
    VirtSize:    00000004h  VirtAddr:       00002000h
    raw data offs:    00000000h  raw data size:    00000000h
    relocation offs:    00000000h  relocations:    00000000h
    line # offs:      00000000h  line #'s:       00000000h
    characteristics:    D0000080h
    UNINITIALIZED_DATA  SHARED  READ  WRITE  ALIGN_DEFAULT(16)  

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

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


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

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


 




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


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

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