shmat()为不同的程序返回不同的地址,所有程序都具有相同的共享内存[重复]
Posted
技术标签:
【中文标题】shmat()为不同的程序返回不同的地址,所有程序都具有相同的共享内存[重复]【英文标题】:shmat() returning different address for different programs, all having same shared memory [duplicate] 【发布时间】:2014-01-07 06:48:21 【问题描述】:据我了解,在共享内存中,使用shmat()
调用附加到它的两个进程之间共享相同的逻辑地址。那么为什么我在下面的程序中得到不同的内存地址(在输出中),即使它们共享相同的地址。
//Shm_Server.C
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXSIZE 27
void die(char *s)
perror(s);
exit(1);
int main()
char c;
int shmid;
key_t key = 5678;
char *shm_addr, *s;
if ((shmid = shmget(key, MAXSIZE, IPC_CREAT | 0666)) < 0)
die("shmget");
if ((shm_addr = (char *)shmat(shmid, NULL, 0)) == (char *) -1)
die("shmat");
printf("\nServer shm_addr = %x\n",shm_addr);
s = shm_addr;
for (c = 'a'; c <= 'z'; c++)
*s++ = c;
while (*shm_addr != '*')
sleep(1);
if((shmctl(shmid, IPC_RMID, 0)) < 0)
die("shmctl");
exit(0);
//Shm_Client.C
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXSIZE 27
void die(char *s)
perror(s);
exit(1);
int main()
int shmid;
key_t key = 5678;
char *shm_addr, *s;
if ((shmid = shmget(key, 0, 0666)) < 0)
die("shmget");
if ((shm_addr = (char *) shmat(shmid, NULL, 0)) == (char *) -1)
die("shmat");
printf("\nClient shm_addr = %x\n", shm_addr);
//reading what the server put in shared memory
for (s = shm_addr; *s != '\0'; s++)
putchar(*s);
putchar('\n');
//Writing in shared memory
*shm_addr = '*';
exit(0);
输出:
[xyz@xyz:Shm_ex] $ ./Shm_Server &
[1] 19489
[xyz@xyz:Shm_ex] $
Server shm_addr = d92b5000
./Shm_Client
Client shm_addr = eb3c4000
abcdefghijklmnopqrstuvwxyz
[xyz@xyz:Shm_ex] $
【问题讨论】:
【参考方案1】:据我所知,在共享内存中,共享相同的逻辑地址 在使用 shmat() 调用附加到它的两个进程之间。
据我所知,在共享内存中,同一个物理地址在多个附加到它的进程之间共享。这个物理地址映射到各个进程的所有虚拟地址空间。所以,shmat()
会返回不同的逻辑地址。
【讨论】:
以上是关于shmat()为不同的程序返回不同的地址,所有程序都具有相同的共享内存[重复]的主要内容,如果未能解决你的问题,请参考以下文章
cudaMalloc 在不同的 CPU 线程上返回相同的内存地址