2015-11-15 2 views
1

Я пишу программу, использующую fork(), которая генерирует последовательность Fibonacci, так что если я передал 8 в командной строке, то вывод: 0, 1, 1, 2, 3 , 5, 8, 13, 21 и есть этот выходразделяемая память между родителем и дочерним элементом в c

следующий шаг I'am пытается сделать это разделило между родителем и ребенком с помощью Posix разделяемой памяти, но данные не разделяемые между ними, это мой код:

 pid = fork(); 
     if (pid == 0) 
     { /* create the shared memory object */ 
    shm_fib = shm_open(name, O_CREAT | O_RDWR, 0666); 

    /* configure the size of the shared memory object */ 
    ftruncate(shm_fib, SIZE); 
    /* memory map the shared memory object */ 
    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fib, 0); 
     printf("Child is producing the Fibonacci Sequence...\n"); 
     sprintf(ptr,"%d, %d,",f1,f2); 
     ptr++; 
     for (i=2;i<n;i++) 
     { 
      sum=f1+f2; 
      sprintf(ptr,"%d, ", sum); 
      ptr++; 
      f1=f2; 
      f2=sum; 
     } 
     printf("Child ends\n"); 
     } 
     else 
     { wait(NULL); 
     /* open the shared memory object */ 
     shm_fib = shm_open(name, O_RDONLY, 0666); 

     if (shm_fib == -1) 
     { 

     printf("shared memory failed\n"); 

     exit(-1); 

    } 
    /* memory map the shared memory object */ 
    ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fib, 0); 
     printf("Parent is waiting for child to complete...\n"); 

     /* read from the shared memory object */ 
    printf("%s",(char *)ptr); 
    /* remove the shared memory object */ 
    shm_unlink(name); 
     printf("Parent ends\n"); 
     } 

и это выход:

plz, Enter the value of number to show the fibonacci sequence: 
9 
Child is producing the Fibonacci Sequence... 
Child ends 
shared memory failed 

Кто-нибудь может помочь мне узнать, почему общая память не сработала?!?

+1

Вы можете найти [ESR] (https://en.m.wikipedia.org/wiki/Eric_S._Raymond) 's отличное эссе [Как Задавать Вопросы Smart Way] (http://catb.org/~esr/faqs/smart-questions.html). –

ответ

4

Всегда распечатывайте errno или позвоните по телефону perror, чтобы увидеть точенную ошибку. Это скажет вам, что ошибка «Нет такого файла или каталога». И это вызвано shm_unlink в конце кода. То, что shm_unlink может (и часто выполняется) дочерним, до того, как родитель имел возможность завершить использование разделяемой памяти. И в случае, если это не очевидно, страница человек говорит о shm_unlink:

После успешного shm_unlink(), попытки shm_open() объект с таким же именем не получится

Предлагайте вас просто удалите этот код. Не думайте, что это необходимо, поскольку код родительского процесса уже имеет (более действительный) shm_unlink.

Обновление: Фактически, shm_unlink гарантированно будет выполнен до того, как родитель будет использовать общую память. Поскольку у родителя (правильно) есть wait для завершения ребенка.

+0

спасибо большое, но проблема все еще появляется до тех пор, пока я не изменю shm_unlink, поэтому я пытаюсь изменить оператор sprintf в родительском процессе: sprintf (ptr, "% d,% d", f1, f2); ptr ++; быть отдельным для каждого значения, и это правильно –

1

Как вы разворачиваете, но не выполняете, вы можете просто mmap a MAP_ANONYMOUS (или используя /dev/zero) MAP_SHARED отображение перед форкировкой. Регион будет разделен между обоими процессами:

// Error handling omitted for brevity 
void* ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, -1, 0); 
pid_t pid = fork(); 
if (pid == 0) { 
    // [...] Write the shared memory 
} else { 
    wait(NULL); 
    // [...] Read the shared memory 
} 
Смежные вопросы