日期:2014-05-16  浏览次数:20706 次

shmat(shmid,NULL,0)) shmid相同的话,每次成功调用返回地址是一样,还是不确定
主函数创建两个子进程,每个子进程都有addr = shmat(shmid,NULL,0)) //其中shmid相同
可我发现两个子进程的addr都是一样的,是碰巧还是什么?


shmat(shmid,NULL,0)) shmid相同的话,每次成功调用返回地址是一样,还是不确定?

------解决方案--------------------
应该是不确定的...
楼主可以测试一下,在其中一个子进程里增加一个逻辑,申请一点点堆内存,然后再调用shmat(shmid,NULL,0)) 
两个子进程返回的应该就不一样了。。。test it
------解决方案--------------------
刚想了一下,这样测估计还是一样的,堆内存跟共享内存用的不是同一块地方

可以这样测试:其中一个子进程先申请一点共享内存,shmid为其他的什么值,反正与接下来的shmid不一样就可以了,然后再调用shmat(shmid,NULL,0)),这个时候返回的地址应该就跟另外一个子进程不一样

共享内存使用的是内存结构中的文件映射区
具体的内存分布,可以看一下这篇文章:http://blog.csdn.net/eroswang/archive/2007/04/02/1549110.aspx
------解决方案--------------------
申请分配的共享内存地址空间是固定的。

两个子进程使用的时候用的是同一个共享内存,而且你指定了由系统返回
共享内存的地址,所以返回的地址是一样的
------解决方案--------------------
不一定相同,相同只是偶然现象。
内核为程序分配一块共享内存,这时的地址还是内核地址,需要影射到进程的地址空间,影射过程中,从高地址忘下查找,直到找到空闲,就使这个地址对应那段共享内存空间。