当前位置: 技术问答>linux和unix
难道这样使用共享内存中的指针变量是不允许的吗?
来源: 互联网 发布时间:2016-04-25
本文导语: 难道这样使用共享内存中的指针变量是不允许的吗? 自己定义一个结构,例如 struct t1{ int i; char* p; }pt; 正确创建共享内存后,pt指向共享内存首地址,将p指向这块内存的某个区域mem1,然后从p开始写入一些字符! ...
难道这样使用共享内存中的指针变量是不允许的吗?
自己定义一个结构,例如
struct t1{
int i;
char* p;
}pt;
正确创建共享内存后,pt指向共享内存首地址,将p指向这块内存的某个区域mem1,然后从p开始写入一些字符!
第二个程序同样连接这块内存,获得指针pt,从而获得p的值,但是,很奇怪,使用p的任何操作都不能获得正确的值(也就是p的指向发生了变化),但是i的值是正确的
重新将p手动设置指向mem1,发现,里面的内容是正确的,是刚刚写入的值
问:难道指针p在每次连接共享内存的时候,都要手动设置其指向吗?
RED HAT AS4系统
自己定义一个结构,例如
struct t1{
int i;
char* p;
}pt;
正确创建共享内存后,pt指向共享内存首地址,将p指向这块内存的某个区域mem1,然后从p开始写入一些字符!
第二个程序同样连接这块内存,获得指针pt,从而获得p的值,但是,很奇怪,使用p的任何操作都不能获得正确的值(也就是p的指向发生了变化),但是i的值是正确的
重新将p手动设置指向mem1,发现,里面的内容是正确的,是刚刚写入的值
问:难道指针p在每次连接共享内存的时候,都要手动设置其指向吗?
RED HAT AS4系统
|
因为这个共享内存在两个进程的进程地址空间映射的地址是不相同的,所以要使用相对地址(相对pt)而不是各自进程中的绝对地址
|
分清物理地址跟逻辑地址,进行了共享内存映射后,不同进程内指向该共享内存的地址(逻辑地址)可能是不一样的,但该不同的逻辑地址映射的是同一块物理地址。
|
内存指针p 指向的是进程内存空间中的偏移地址,而不是绝对的物理地址。
attach只是一方面,它的作用是将共享内存映射到你的进程空间中去。
你的描述中说到,
能否理解成,你的这个构造体也作成了共享内存?如果是这样的话,这里就不能存放内存指针了。
每个进程内部,只需要attach一次就可以得到共享内存访问地址了。
不同进程就需要分别独立的进行attach。
attach只是一方面,它的作用是将共享内存映射到你的进程空间中去。
你的描述中说到,
能否理解成,你的这个构造体也作成了共享内存?如果是这样的话,这里就不能存放内存指针了。
每个进程内部,只需要attach一次就可以得到共享内存访问地址了。
不同进程就需要分别独立的进行attach。