返回信息流各位好,这里请教一个共享内存的具体的小问题:我分别使用了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”的内存区进行处理时没有问题的,忘大牛出手相助
这是一条镜像帖。来源:北邮人论坛 / soft-design / #37539同步于 2010/1/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
急求:请教一个关于linux内存映射的问题
chensiever
2010/1/27镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
人家那不是fork么?怎么扯线程去了?
不过还是没明白,光共享指针,不共享数据,也可以两个进程正确访问?
【 在 coolwc 的大作中提到: 】
: memory mapping 是用来在进程间共享内存或者文件的 而不是在线程间共享
整个的过程如下
申请共享内存
把共享内存映射到一个本地地址
fork()--此时 整个进程空间被原样复制了一份,也就是说之前的那个(本地地址--共享内存)的映射也被复制了
再使用这个相同的地址去访问 操作系统就会替你访问那个共享的内存空间
【 在 ericyosho 的大作中提到: 】
: 人家那不是fork么?怎么扯线程去了?
: 不过还是没明白,光共享指针,不共享数据,也可以两个进程正确访问?
因为是MAP_SHARED吧, private mapping在fork的父子进程间是独立的
【 在 coolwc (小包) 的大作中提到: 】
: 整个的过程如下
: 申请共享内存
: 把共享内存映射到一个本地地址
: fork()--此时 整个进程空间被原样复制了一份,也就是说之前的那个(本地地址--共享内存)的映射也被复制了
: 再使用这个相同的地址去访问 操作系统就会替你访问那个共享的内存空间
那就是说,如果有mmap的操作,是在main函数运行前进行的?
因为如果执行到语句的时候再申请那个内存块,存在可能申请到的内存块的地址,已经和local的地址相冲突了。
这个 映射到本地地址 是什么意思呢?
【 在 coolwc 的大作中提到: 】
: 整个的过程如下
: 申请共享内存
: 把共享内存映射到一个本地地址
: ...................
网上找到的例子:
范例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
貌似可以啊