我目前正在实现两个代码之间的耦合,并且为了允许它们之间进行通信,我创建了一个共享内存段,该段由命名信号量进行同步。
我的问题如下:我在第一个过程中创建了具有一定大小的共享内存段(使用 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++;
}
}
}