BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #37539同步于 2010/1/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

急求:请教一个关于linux内存映射的问题

chensiever
2010/1/27镜像同步9 回复
各位好,这里请教一个共享内存的具体的小问题:我分别使用了mmap和shmget来实现父子进程的内存共享,都不能达到程序的需求。我们这个程序(见下)中需要对主程序中的包记录对应的指针进行映射,而主进程每处理完一条包记录后指针会偏移进行循环处理,现在子进程函数不能处理映射的包指针。另外想请教类似于这样在主进程映射循环的指针,有没有比较好的方法,谢谢大家! int main() { //此处是对数据包进行循环处理 for(int i=0;i<=1000;i++) { processed = 0; //bottom是数据包的起始地址(指针),也是子进程处理函数的参数,在此进行内存映射。每处理完一条记录bottom加上数据包长度len进行偏移 bottom=(uint8_t*)mmap(NULL,sizeof(char)*len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); //bottom进行偏移,接着进行循环 bottom += len; processed += len; } } int pid; if((pid = fork()) ==0) { //在这里处理的有问题 functionHandle(bottom); } else { } } 另外也使用了 shm_id = shmget(IPC_PRIVATE,1024*1024*1024,IPC_CREAT); bottom = (uint8_t*)shmat(shm_id,NULL,0); 都不成功。单独做了测试对类似“helloword”的内存区进行处理时没有问题的,忘大牛出手相助
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
coolwc机器人#1 · 2010/1/28
memory mapping 是用来在进程间共享内存或者文件的 而不是在线程间共享
ericyosho机器人#2 · 2010/1/28
人家那不是fork么?怎么扯线程去了? 不过还是没明白,光共享指针,不共享数据,也可以两个进程正确访问? 【 在 coolwc 的大作中提到: 】 : memory mapping 是用来在进程间共享内存或者文件的 而不是在线程间共享
coolwc机器人#3 · 2010/1/29
整个的过程如下 申请共享内存 把共享内存映射到一个本地地址 fork()--此时 整个进程空间被原样复制了一份,也就是说之前的那个(本地地址--共享内存)的映射也被复制了 再使用这个相同的地址去访问 操作系统就会替你访问那个共享的内存空间 【 在 ericyosho 的大作中提到: 】 : 人家那不是fork么?怎么扯线程去了? : 不过还是没明白,光共享指针,不共享数据,也可以两个进程正确访问?
Bergwolf机器人#4 · 2010/1/29
因为是MAP_SHARED吧, private mapping在fork的父子进程间是独立的 【 在 coolwc (小包) 的大作中提到: 】 : 整个的过程如下 : 申请共享内存 : 把共享内存映射到一个本地地址 : fork()--此时 整个进程空间被原样复制了一份,也就是说之前的那个(本地地址--共享内存)的映射也被复制了 : 再使用这个相同的地址去访问 操作系统就会替你访问那个共享的内存空间
ericyosho机器人#5 · 2010/1/29
那就是说,如果有mmap的操作,是在main函数运行前进行的? 因为如果执行到语句的时候再申请那个内存块,存在可能申请到的内存块的地址,已经和local的地址相冲突了。
hman机器人#6 · 2010/2/11
这个 映射到本地地址 是什么意思呢? 【 在 coolwc 的大作中提到: 】 : 整个的过程如下 : 申请共享内存 : 把共享内存映射到一个本地地址 : ...................
hman机器人#7 · 2010/2/11
网上找到的例子: 范例2:父子进程通过匿名映射实现共享内存 #include <sys/mman.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> typedef struct{ char name[4]; int age; }people; main(int argc, char** argv) { int i; people *p_map; char temp; p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); if(fork() == 0) { sleep(2); for(i = 0;i<5;i++) printf("child read: the %d people's age is %d\n",i+1,(*(p_map+i)).age); (*p_map).age = 100; munmap(p_map,sizeof(people)*10); //实际上,进程终止时,会自动解除映射。 exit(); } temp = 'a'; for(i = 0;i<5;i++) { temp += 1; memcpy((*(p_map+i)).name, &temp,2); (*(p_map+i)).age=20+i; } sleep(5); printf( "parent read: the first people,s age is %d\n",(*p_map).age ); printf("umap\n"); munmap( p_map,sizeof(people)*10 ); printf( "umap ok\n" ); } 考察程序的输出结果,体会父子进程匿名共享内存: child read: the 1 people's age is 20 child read: the 2 people's age is 21 child read: the 3 people's age is 22 child read: the 4 people's age is 23 child read: the 5 people's age is 24 parent read: the first people,s age is 100 umap umap ok 貌似可以啊
hman机器人#8 · 2010/2/11
有谁有linux的机器 帮忙试试看? 不过这个例子也有点问题,但至少可以说明mmap是可以用的咯
ericyosho机器人#9 · 2010/2/12
试了啊,挺好的,你想要得到什么结果呢? 没明白。