在c中父母和孩子之间共享内存

时间:2015-11-15 23:56:37

标签: c posix shared-memory fibonacci

我正在使用fork()编写一个程序来生成Fibonacci序列,这样如果我在命令行中传递8,则输出为: 0,1,1,2,3,5,8,13,21 并有这个输出

下一步我试图让它使用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

任何人都可以帮助我知道为什么共享内存失败了?!?

2 个答案:

答案 0 :(得分:4)

始终打印<Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="{Binding Color1.Color}" /> </Setter.Value> </Setter> 或致电errno以查看确切错误。这将告诉你错误是&#34;没有这样的文件或目录&#34;。这是由代码末尾的perror引起的。在父母有机会完成对共享内存的使用之前,shm_unlink可以(通常是)由孩子执行。如果不明显,手册页会说明shm_unlink

  

成功shm_unlink()后,尝试shm_open()一个对象   具有相同名称将失败

建议您删除该代码。不要认为它是必需的,因为父进程代码已经有一个(更有效)shm_unlink

更新:事实上,保证在父使用共享内存之前执行shm_unlink。因为父(正确)有一个shm_unlink供孩子完成。

答案 1 :(得分:1)

当您分叉但不执行时,您可以在分叉前mmap MAP_ANONYMOUS(或使用/dev/zeroMAP_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
}