共享内存段:如何调整大小?

时间:2018-07-13 14:00:33

标签: c multiprocessing shared-memory

我目前正在实现两个代码之间的耦合,并且为了允许它们之间进行通信,我创建了一个共享内存段,该段由命名信号量进行同步。

我的问题如下:我在第一个过程中创建了具有一定大小的共享内存段(使用 shmget shmat 之后)。之后,我在第二个过程中(使用 shmat )打开了这个共享段,并尝试增加共享内存的大小。为此,我已将 mremap 与MREMAP_MAYMOVE标志一起使用。如果我对手册页的理解是正确的,则可以使用此功能将初始共享内存段复制到其新的本地化位置,并增加或缩小该段的大小。

在调用* mremap *之后,我尝试访问共享内存的新部分,但是奇怪的是出现了段错误...我读到我的问题的解决方案是创建一个更大的新共享内存段中,将前一个复制到第二个中,最后删除第一个,但是我想避免这种解决方法。

以下是代码中有趣的部分:

  size_t old_size = (sizeof(coupling_strC) + sizeof(double)*4*npt_bnd);
  size_t new_size = (sizeof(coupling_strC) + sizeof(double)*4*npt_bnd + sizeof(int)*2*n_part + sizeof(double)*n_part);
  shm_addr = mremap(shm_addr, old_size, new_size, MREMAP_MAYMOVE);
  if(shm_addr == MAP_FAILED){
   perror("mremap");
   exit(EXIT_FAILURE);
  }
  strC = (coupling_strC *) shm_addr;
  strC->pos_bnd = (double*) ( (size_t)shm_addr + sizeof(coupling_strC) );
        strC->vel_bnd = (double*) ( (size_t)shm_addr + sizeof(coupling_strC) + sizeof(double)*2*npt_bnd);
  strC->ind_part = (int*) ( (size_t)shm_addr + sizeof(coupling_strC) +  sizeof(double)*4*npt_bnd);
  strC->vort_part = (double*) ( (size_t)shm_addr + sizeof(coupling_strC) + sizeof(double)*4*npt_bnd + sizeof(int)*2*n_part);


  /*Writing of index of particules into the structure */
  n_part = 0;
  for(int i=0;i<sizeX;i++){
    for(int j=0;j<sizeY;j++){
      x_part[0] = (i+0.5)*h_part;
      x_part[1] = (j+0.5)*h_part;

      corners[0][0] = x_part[0] + 0.5*h_part;
      corners[0][1] = x_part[1] - 0.5*h_part;

      corners[1][0] = x_part[0] + 0.5*h_part;
      corners[1][1] = x_part[1] + 0.5*h_part;

      corners[2][0] = x_part[0] - 0.5*h_part;
      corners[2][1] = x_part[1] + 0.5*h_part;

      corners[3][0] = x_part[0] - 0.5*h_part;
      corners[3][1] = x_part[1] - 0.5*h_part;

      int check = 0;
      for(int k=0;  k<4 ; k++){
        if( ((((bbox_min[0]<=corners[k][0]) && (corners[k][0])<=bbox_max[0])) && ((bbox_min[1]<=corners[k][1]) && (corners[k][1]<=bbox_max[1])))){
          check++;
        }
      }
      if(check == 4){
        strC->ind_part[2*n_part] = i;
        strC->ind_part[2*n_part + 1] = j;
        strC->vort_part[n_part] = 0.0;
        n_part++;
      }
    }
  }

0 个答案:

没有答案