[英]How to give starting address to attach to that in shmat() shared memory segment?
根據要求包含所有標題。 下面的這段代碼正在運行,但問題在於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將成為我想要的地址。 但它給出了分段錯誤
或者,第三個參數是否也存在問題? 任何幫助或建議將不勝感激
我不確定你在這里用posix_memalign()
做什么。 您正在調用該函數從堆中分配一塊內存,然后嘗試使用posix_memalign()
返回的相同地址作為映射共享內存段的位置。 該地址顯然無法使用,因為它是堆的一部分!
我看到你在調用shmat()
posix_memalign()
之前釋放posix_memalign()
返回的塊,但是從堆中釋放一塊內存不會(通常)導致堆縮小,所以地址實際上仍然是堆。
如果必須為shmat()
選擇自己的地址,則應選擇與地址空間中的任何其他地址相距甚遠的地址,以避免與堆或任何其他映射沖突,並避免堆與映射相遇因為它在你的過程中生長。 確定這樣的地址本質上是不可移植的。
我想要為映射選擇固定地址的唯一原因是確保它在幾個不同的進程中映射為相同的地址(這樣內部指針可以工作)。 如果這是您想要的,您可以讓操作系統在第一個進程中選擇位置,並在第二個和所有其他進程中使用相同的地址調用shmat()
。 即使這可能不起作用,因為其他進程可能恰好已經映射到同一地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.