当前位置: 技术问答>linux和unix
linux 内存共享问题
来源: 互联网 发布时间:2016-08-25
本文导语: 有两个进程, A 和 B 用nmap实现共享, 但是结果和想象的不一样 ================================================= A 进程代码 int fd; char *prt; char *msg="My name is Foo!"; fd=open("sharefile",O_RDWR|O...
有两个进程, A 和 B 用nmap实现共享, 但是结果和想象的不一样
=================================================
A 进程代码
int fd;
char *prt;
char *msg="My name is Foo!";
fd=open("sharefile",O_RDWR|O_CREAT,00777);
write(fd,msg,strlen(msg)+1);
prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
memcpy(prt,msg,strlen(msg)+1);
printf("%sn",prt);
sleep(10); /*等待b去修改共享内存内容。*/
printf("%s",prt);
munmap(prt,strlen(msg)+1);
=====================================================
// B 进程代码
int fd;
char *prt;
char *msg="My name is Bar!";
fd=open("sharefile",O_RDWR,00777);
prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
memcpy(prt,msg,strlen(msg)+1);
munmap(prt,strlen(msg));
=============================================
在一个控制台开启进程A 在另一个控制台开启B
A显示结果如下, 和想象的不一样
My name is Foo!
My name is Foo!
进程B 的运行对A没有起作用,
请分析原因,谢谢!
=================================================
A 进程代码
int fd;
char *prt;
char *msg="My name is Foo!";
fd=open("sharefile",O_RDWR|O_CREAT,00777);
write(fd,msg,strlen(msg)+1);
prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
memcpy(prt,msg,strlen(msg)+1);
printf("%sn",prt);
sleep(10); /*等待b去修改共享内存内容。*/
printf("%s",prt);
munmap(prt,strlen(msg)+1);
=====================================================
// B 进程代码
int fd;
char *prt;
char *msg="My name is Bar!";
fd=open("sharefile",O_RDWR,00777);
prt=(char*) mmap(NULL,strlen(msg)+1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
close(fd);
memcpy(prt,msg,strlen(msg)+1);
munmap(prt,strlen(msg));
=============================================
在一个控制台开启进程A 在另一个控制台开启B
A显示结果如下, 和想象的不一样
My name is Foo!
My name is Foo!
进程B 的运行对A没有起作用,
请分析原因,谢谢!
|
mmap的内存共享只能用于有亲缘关系的进程之间,比如父子进程之间;不能用于没有关系的进程之间;若要在没有关系的进程之间共享内存,应该用shmget/shmat/shmdt之类的调用来完成(这是System V的IPC机制之一,共享内存段);其实,你自己想想也应该明白,两个不相关的进程调用mmap时,都是在自己的地址空间中进行映射,两者没有一点关系,怎么能共享?至于父子进程,因为是copy关系,由于mmap用了MAP_SHARED参数,子进程copy的时候,子进程是copy相应空间的地址(这和C语言中,copy指针本身,而不是指针所指的值有点相似),所以可以共享.
|
程序是正确的。楼主确定一下在
1. A,B两个程序在相同的目录运行。
2. A先运行,10秒内启动B.
1. A,B两个程序在相同的目录运行。
2. A先运行,10秒内启动B.
|
你再printf之前用了memcpy,那还跟mmap有什么关系?