我只想知道共享內存駐留在Linux系統中的位置?它在物理內存還是虛擬內存中?linux共享內存實際在哪裏?
我知道有關進程的虛擬內存發送信箱,他們從不同的工藝處理和流程沒有看到對方的記憶,但我們可以利用IPC進程之間傳遞數據。爲了實現這個簡單的場景,我剛創建了一個簡單的共享內存程序,並嘗試從shmat
函數中打印共享內存地址和返回值,但是這兩個進程的地址不同,但值相同。
這裏是寫程序。
爲write.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int main() {
key_t key=1235;
int shm_id;
void *shm;
int *ptr = 83838;
shm_id = shmget(key,10,IPC_CREAT | 0666);
shm = shmat(shm_id,NULL,NULL);
sprintf(shm,"%d",ptr);
printf("Address is %p, Value is %p \n", (void *)shm, (void *)&ptr);
printf("Shm value is %d \n", *(int *)shm);
return;
}
這裏是閱讀器程序。
read.c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
key_t key=1235;
int shm_id;
void *shm;
int *p = (int *)malloc(sizeof(int));
shm_id = shmget(key,10,NULL);
shm = shmat(shm_id,NULL,NULL);
if(shm == NULL)
{
printf("error");
}
sscanf(shm,"%d",p);
printf("Address is %p %p %p %d\n",(void *)shm, (void *)p, (void *)&p, *p);
printf("Shared value is %d \n", *(int *)shm);
return 0;
}
這將是巨大的,如果有人能請詳細解釋瞭如何處理同一個值,儘管有不同的地址?
這個問題來自C pass void pointer using shared memory。
謝謝。
其真實物理地址共享 – user2760375
正如您所理解的答案的解釋,請接受它 – tez