我在Linux 2.6上,我有一個奇怪的問題。我有3個併發進程(從同一進程派生)需要獲得3個不同的共享內存段,每個進程一個進程。每個過程的執行代碼(請注意,「信息」類型是用戶自定義)當進程使用shm_open()時,Linux內核如何分配內存指針?
message *m;
int fd = shm_open("message", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(message));
m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
char messagename[16];
snprintf(messagename, sizeof(messagename), "%p", m);
char path[32] = "/dev/shm/";
strcat(path, messagename);
rename("/dev/shm/message", path);
讓我解釋一下:我希望每一個進程分配它包含一個消息的共享內存區。爲了確保另一個進程(消息接收者)可以訪問相同的shm,我然後將我的shm文件從「消息」重命名爲以消息指針命名的字符串(這是因爲接收消息的進程已經知道指針)。當我執行程序時,我試圖打印(爲了調試目的)每個進程在使用shm_open獲得的fd映射時收到的指針,並且我注意到它們都獲得了SAME指針。這怎麼可能?我認爲也許其他進程在第一次執行shm_open()後做了重命名,因此我還嘗試通過使用進程共享互斥鎖來使這些代碼行成爲原子操作,但問題仍然存在。
我真的很感激任何形式的幫助或建議。
謝謝,您使用pid的想法看起來不錯,我當然會給它一個鏡頭。然而,通過shm_open()我問一個共享的(而不是私有的)內存指針,並且我每次都期待着一個不同的指針,而不管這個進程的虛擬內存空間是什麼,我認爲在共享內存方面並不相關。 此外,即使我爲進程調用的每個shm_open()使用了不同的名稱,它們也都會得到相同的地址。如果shm_open()+ mmap()給出共享內存指針,如果shm的名稱不同,它們又怎麼能相同呢? –
從進程訪問內存的所有訪問都經過該進程的虛擬地址空間。底層內存可能是共享的,但每個應用程序的視圖都是私有的。因此,它可能出現在每個進程中的相同地址,或者不同進程中的不同地址,完全由OS自行決定。 – mhsmith
......或者相反,不同的共享內存塊可能出現在不同進程的相同地址,這就是發生在你身上的事情。 – mhsmith