Общая память для форка - PullRequest
       17

Общая память для форка

2 голосов
/ 26 декабря 2009

Я хочу создать общую память между двумя процессами. Я использовал fork (). Ребенок пытается изменить эту общую память, и мать создает другого ребенка, поэтому новый ребенок пытается изменить ту же самую память и так далее. Вот мой код в программировании на Си. (Убунт)

mylist ch=NUL; 
f=fork();
if(!f){
        pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/
        ch=(mylist *) shmat(pba,0,0);
        ch->name=ugur;
        ch->surname=cedric;
...do something...
}
else{
        if(ch)
        printf("this is top of mylist %s"ch->name);
.......do something
}

Он никогда не пишет ch-> name. Зачем? Я создал общую память. Почему родительский процесс не может прочитать?

Ответы [ 6 ]

5 голосов
/ 26 декабря 2009

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

У вас есть два варианта, простой и сложный:

  • Создать и подключить к общей памяти перед разветвлением. И родитель, и ребенок автоматически получают доступ к одной и той же общей памяти.

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

Вам необходимо выделить более 1 символа общей памяти для хранения полезных строк, таких как имена.

3 голосов
/ 26 декабря 2009

У вас есть состояние гонки, что если родитель бежит раньше ребенка, и вы пытаетесь получить доступ к ch-> до того, как ребенок что-то там поместил?

Вы также выделяете только 1 байт (sizeof (char)), но вы пытаетесь рассматривать это как указатель на структуру - вам нужно выделить достаточно места для mylist - если вы не сделали этого более ошибочно. Вам понадобится флаг IPC_CREAT, чтобы тоже куда-то шаметь.

1 голос
/ 26 декабря 2009

При написании кода ch указывает на некоторую разделяемую память, но сам ch (т.е. указатель) не разделяется. Поскольку присваивание ch происходит только у потомка, родитель будет продолжать видеть ch как NULL.

У вас есть два способа исправить это:

  1. Настройте общую память до разветвления.
  2. Пусть родитель и ребенок открывают одну и ту же общую память.

При работе с записями в общей памяти вам необходимо убедиться, что все данные для этой записи находятся в общей памяти. Например, в этом коде:

    ch->name=ugur;
    ch->surname=cedric;

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

1 голос
/ 26 декабря 2009

, если при первом запуске родительский процесс не может получить доступ к ch->name, потому что ch->name=ugur; еще не запущен. .
одно решение, которое, я думаю, получит общую память до fork() и использует ее в дочерних и родительских элементах.

0 голосов
/ 15 марта 2013

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

0 голосов
/ 26 декабря 2009

Если я создаю и присоединяю разделяемую память перед разветвлением, тогда я не могу проверить, является ли разделяемая память NULL или нет. Инициируется при присоединении.

...