Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Barak_Banana

Хранение указателей в разделяемой памяти

29.10.2012, 00:11. Показов 1839. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выручайте ребята.

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

Хранение в разделяемой памяти я организовал как массив указателей.
Основной процесс создает сегмент разделяемой памяти и запускает дочерние процессы, которые добавляют в нее элементы. После завершения дочерних процессов, обращаюсь к массиву из основного процесса, но элементов, которые добавлялись в дочерних процессах, там нет. Может я неправильно добавляю элемент в массив?

Создание сегмента разделяемой памяти в основном процессе:
C
1
2
3
4
5
6
7
shm_id = shmget(IPC_PRIVATE, sizeof(NODE)*count, 0666);
    if(shm_id<0)
    {
        printf("shmget error\n");
    }
 
    arrayOfpNODE = (NODE**)shmat(shm_id, NULL, 0);
arrayOfpNODE - указатель на массив указателей

Синхронизация адресов в процессах-потомках:
C
1
2
3
...
arrayOfpNODE = (NODE**)shmat(shm_id, NULL, 0);
...
Добавление указателей в массив (блокируется мьютексом):
C
1
2
3
...
arrayOfpNODE[(*pcounter)++] = (NODE*)malloc(sizeof(NODE));
...
pcounter - указатель на int, который тоже храниться в разделяемой памяти, но с ним проблем не возникло.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.10.2012, 00:11
Ответы с готовыми решениями:

Запись и считывание разделяемой памяти
Всем доброго времени суток. Столкнулся с одной проблемой. Есть две программы: 1 создаёт разделяемую память и записывает туда данные, а...

Сделать массив из 10 int в разделяемой памяти
Хочу сделать массив из 10 int в разделяемой памяти. Доступ из разных процессов от fork(). Так понимаю, 19-20 строки должны сказать...

В чем основное преимущество разделяемой памяти
Подскажите в чем основное преимуществоразделяемой памяти

3
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
29.10.2012, 09:26
Память полученная от malloc() доступна только процессу который ее выделил. Вам нужно хранить не только указатели, но и сами структуры в shm.
В соседнем родственном разделе недавно было...
1
Barak_Banana
29.10.2012, 17:15
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Память полученная от malloc() доступна только процессу который ее выделил. Вам нужно хранить не только указатели, но и сами структуры в shm.
В соседнем родственном разделе недавно было...
Спасибо, исправил. Теперь я храню массив указателей и массив структур в одной разделяемой памяти.
C
1
2
3
4
...
arrayOfpNode = (NODE**)shmat(shm_id, NULL, 0);
arrayOfNodes = (NODE*)((void*)arrayOfpNODE + sizeof(NODE)*count);
...
И при создании ноды
C
1
2
3
4
5
...
//инициализирую поля arrayOfNodes[(*pcounter)]
...
arrayOfpNode[(*pcounter)] = &(arrayOfNodes[(*pcounter)]);
...
arrayOfNodes отлично читается из родительского процесса, а вот указатели из arrayOfpNode нет. Может ли быть, что для сохранения указателей в разделяемую память нужны дополнительные операции с этим сегментом?
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
30.10.2012, 13:59
Цитата Сообщение от Barak_Banana Посмотреть сообщение
Может ли быть, что для сохранения указателей в разделяемую память нужны дополнительные операции с этим сегментом?
Если Вы хотите использовать именно указатели (общепринятая практика использовать смещение от начала shm вместо указателей), Вам нужно подключать shm по одному виртуальному адресу во всех процессах. man shmat про 2й параметр.

Добавлено через 20 часов 10 минут
UP: перечитал Ваше исходное сообщение еще раз.
Цитата Сообщение от Barak_Banana Посмотреть сообщение
Основной процесс создает сегмент разделяемой памяти и запускает дочерние процессы, которые добавляют в нее элементы.
Если тут речь идет только о fork(), то просто делайте shmat() 1 раз в родителе перед 1м fork().
Если все-таки, там что-то fork()+exec() подобное, то лучше использовать смещения, а не указатели.

В man shmat этого не указанно, но на большей части открытых систем shmat() реализован через mmap(). У которого адрес на который Вы делаете атач - только хинт (man mmap).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.10.2012, 13:59
Помогаю со студенческими работами здесь

Межпотоковое взаимодействие с использованием разделяемой памяти и неименованных каналов
Ребят возникла следующая проблема.. Нeoбходимo сoздать 3 потoка. 1 глaвный и 2 дополнительных. У потока на вхoде текстoвый файл. ...

Синхронизация доступа к разделяемой памяти
Когда потоки являются дочерними по отношению к процессу тут все просто - объект мьютекса находится в общей памяти и используя этот объект...

Аська на основе разделяемой памяти
Прогреры и хакеры и им подобные... обращаюсь с особой просьбой: есть мысли по поводу перессылки сообщений через разделяемую память между...

Считать структуру из разделяемой памяти
Добрый день! Есть разделяемый файл. В приложении А в файл запихиваю структуру. В приложении Б считываю эту структуру из файла. Выдается...

Прогон программ с использованием разделяемой памяти
/* Мы организуем разделяемую память для массива из трех целых чисел. Первый элемент массива является счетчиком числа запусков программы...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru