当前位置: 技术问答>linux下共享内存shmat失败
iis7站长之家
linux shmat问题
来源: 互联网 发布时间:2016-06-04
本文导语: 我在做一个项目,里面用到了共享内存,我想用一个共享内存存放另一个共享内存的地址,在其他进程访问的时候第一个共享内存时能找到另一个共享内存的地址以便往里面放内容 ,现在的问题是linux系统用函数shmat...
我在做一个项目,里面用到了共享内存,我想用一个共享内存存放另一个共享内存的地址,在其他进程访问的时候第一个共享内存时能找到另一个共享内存的地址以便往里面放内容 ,现在的问题是linux系统用函数shmat得到的不是实际的物理地址而是自己进程的虚拟地址,导致我的功能无法实现,不知哪位高手能告诉我怎么弄。
|
按照楼主的意思,在共享内存不要存其他共享内存的地址,这些地址都是其他进程的虚拟地址,是不可跨进程访问的.
在第一个共享内存的队列里可存储其他共享内存的共享内存ID,或者是其他共享内存的名字.
1.如果在第一个共享内存中存储其他共享内存的Id号,其他进程在访问第一个共享内存中的ID号,然后用shmat命令把这个ID所
对应的共享内存段连接到自己的进程空间上;
2.如果在第一个共享内存中存储其他共享内存的名字
注:共享内存的名字一般是一个Unix的绝对路径名,可以通过ftok(路径名,0)计算出共享内存ID.通过这种方式计算出来的共享内存ID号是唯一的,即一个共享内存名唯一对应一个共享内存ID,然后再用shmat命令把这个ID所对应的共享内存段连接到自己的进
程空间上;
|
一般来说,除了 dma 外,cpu 都是使用虚拟地址,不用物理地址的。
貌似你就是建立了两个共享内存嘛,无论你使用哪种方式,每个进程都要将每一个共享内存映射到自己的虚拟地址空间才能使用...
貌似你就是建立了两个共享内存嘛,无论你使用哪种方式,每个进程都要将每一个共享内存映射到自己的虚拟地址空间才能使用...
|
你需要在第一个共享内存区域里存储好,第2个共享内存的shm_id等等,这些东西。然后其他进程访问的时候,要重新对第2块区域ftok,shmget。
这样还不能实现?
|
不行就用管道
|
不太明白你想这样做有什么实际意义。
难道你除了第一个共享内存区,其他的共享内存区的ID都是事先未知的?如果是这样那你只有在第一个共享内存区中存放其他的共享内存的ID号了。或者通过其他ipc方式传递ID号。
难道你除了第一个共享内存区,其他的共享内存区的ID都是事先未知的?如果是这样那你只有在第一个共享内存区中存放其他的共享内存的ID号了。或者通过其他ipc方式传递ID号。
|
学习
|
逻辑混乱了吧。。。 不管你再折腾 。。。 就一点 你至少 进程 得先映射 再使用。 你其他的进程得到的地址,只是某个进程映射了共享内存的地址,咋能使用呢?