首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

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

2012-02-10 
shmat(shmid,NULL,0))shmid相同的话,每次成功调用返回地址是一样,还是不确定主函数创建两个子进程,每个子

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
[解决办法]
申请分配的共享内存地址空间是固定的。

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

热点排行
Bad Request.