所有标题都根据要求包含在内。下面的这段代码可以正常工作,但问题出在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 将是我想要的地址。但它给出了分段错误
或者,第三个参数也有问题吗?任何帮助或建议将不胜感激