0

所有标题都根据要求包含在内。下面的这段代码可以正常工作,但问题出在shmat(seg_id,NULL,0). NULL在第二个参数中表示操作系统将代表用户处理该位置。但是我们可以给出我们自己的内存位置但是如何呢?我不知道,请帮忙。(OS - Ubuntu 11.04 ,Compiler gcc 4.5.2) 我试过man shmat但没有完全理解

typedef struct {
         int id;
} emp;

int main() {
         emp *e;
         int seg_id;
         const int size=sizeof(emp);
         seg_id=shmget( IPC_PRIVATE, size, S_IRUSR | S_IWUSR); 
         pid_t pid=fork();
         if(pid<0) {
                 printf("Error");
                 return -1;
         }
         else if(pid == 0) {
                e=(emp *)shmat(seg_id,NULL,0);     
                 e->id=123;
                 shmdt(e);                       
         }
         else {
                 wait(NULL);
                 e=(emp *)shmat(seg_id,NULL,0);  
                 printf("\nEmp Id : %d\n\n",e->id);
                 shmdt(e);                          
                 shmctl(seg_id, IPC_RMID, NULL);  
         }
         return 0;
}

我也试过这个来获得我们自己shmget()的 4K 页面对齐地址

emp *e;
void **p;
posix_memalign(&p,4096,4096); // alignment as of pagesize 4K 
e=p; // get the first address of the aligned memory 
free(p); // free the allocated memory

然后将此用作shmat(seg_id,e,0);// 认为 e 将是我想要的地址。但它给出了分段错误

或者,第三个参数也有问题吗?任何帮助或建议将不胜感激

4

1 回答 1

2

我不确定你想在这里做什么posix_memalign()。您正在调用该函数以从堆中分配一块内存,然后尝试使用返回的相同地址posix_memalign()作为映射共享内存段的位置。该地址显然不可用,因为它是堆的一部分!

我看到您posix_memalign()在调用之前释放了返回的块shmat(),但是从堆中释放一块内存(通常)不会导致堆缩小,所以地址实际上仍然是堆的一部分。

如果您必须为 选择自己的地址shmat(),则应选择远离地址空间中其他任何地址的地址,以避免与您的堆或任何其他映射冲突,并避免堆在增长时与您的映射发生冲突在您的流程生命周期中。确定这样的地址本质上是不可移植的。

The only reason I can think of for wanting to choose a fixed address for your mapping is to make sure it's mapped as the same address in several different processes (so that internal pointers can work). If that's what you want, you can let the OS choose the location in the first process and call shmat() with that same address in the second and all other processes. Even that may not work though, because other processes may happen to already have something mapped at the same address.

于 2012-11-04T01:07:24.190 回答