Язык C: Как разделить структуру (или, если это невозможно, массив) между родительским и дочерним (разветвленными) процессами через IPC? - PullRequest
4 голосов
/ 08 февраля 2011

Я гуглил это в течение последних двух недель, и я не получил никакого ответа. Вот что у меня есть:

  • Родительский процесс, который создает структуру myStruct, которая в основном представляет собой связанный список с использованием указателей (если это серьезная проблема, я могу согласиться использовать вместо этого массив фиксированного размера).

  • Фиксированное число дочерних процессов, созданных с помощью fork(), которым необходим доступ на чтение / запись к структуре (или массиву), созданному родителем.

Я не знаю, как это сделать, чтобы переменная myStruct стала общей для процессов.

Я пытался решить проблему, используя такие функции SysV IPC, как shmget(), shmat() и т. Д., Чтобы распределить свою переменную в разделяемой памяти, но я не знаю, как работать с указателями пустой памяти для чтение / запись значений в myStruct.

В идеале я хотел бы иметь возможность использовать точечную нотацию (myStruct.node)->attribute = value в каждом процессе без необходимости иметь дело с указателями, поскольку я не знаю, как моя структура организована в память.

Возможно ли это? Могут ли некоторые из вас помочь? Любая помощь очень ценится.

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

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Если вы создаете общее анонимное сопоставление с:

p = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

Тогда эти страницы будут не копироваться при записи, а скорее будут использоваться всеми разветвленными процессами.

Обратите внимание, что вы должны быть осторожны с блокировкой здесь. Вы можете использовать стандартные взаимные исключения pthread и condvars в сегменте общей памяти между процессами, если (и только если!) Вы используете pthread_mutexattr_setpshared и pthread_condattr_setpshared, чтобы пометить их как общие для процессов .

Обратите внимание также, что этот метод отображает фиксированный размер арены, и должен быть выполнен до разветвления . Как вы управляете содержимым памяти в p, зависит от вас. Нетривиально создать арену с разделяемой памятью с изменяемыми размерами; если вы хотите пойти по этому пути, я бы рекомендовал опубликовать второй вопрос, так как могут потребоваться другие подходы.

0 голосов
/ 08 февраля 2011

Самый простой способ разделить память между вилками - это использовать mmap() ed область памяти. Если вы используете анонимный mmap() (с MAP_ANON и MAP_SHARED) для хранения своей структуры (массива, чего угодно) вместо malloc() ed памяти, она будет использоваться дочерним процессом.

...