匿名映射区-mmap

     匿名映射区的建立,不需要打开一个文件就可以进行映射,并用来进行父子进程间通信。

     Linux系统中,有一个宏定义: MAP_ANONYNOUS或者MAP_ANON可以创建匿名映射,而不需要使用文件。

*******************************************************************************************************************************

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>

int var = 12;

int main(int argc,char *argv[])
{
int *mf;
pid_t pid;
//MAP_ANONYMOUS == MAP_ANON
mf = (int*)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_ANONYMOUS|MAP_SHARED,-1,0);
if(mf == MAP_FAILED)
{
perror("mmap error.");
exit(1);
}


pid = fork();
if(pid < 0)
{
perror("fork error.");
munmap(mf,4);
exit(-1);
}
else if(pid == 0)
{
*mf = 100;
var = 24;
printf("child: *mf = %d;var = %d\n",*mf,var);
}
else
{
sleep(1);
printf("parent: *mf = %d;var = %d\n",*mf,var);
wait(NULL);

munmap(mf,4);
}

return 0;
}

程序执行的结果为:

 

 由以上结果可知,映射成功。

*******************************************************************************************************************************

但是以上两个宏定义仅仅适用于linux中。在UNIX及其他类UNIX系统中是不存在这两个宏定义的。

那么匿名映射的创建就需要使用其他方法:

int fd = open("/dev/zero",O_RDWR);

char *p = (char*)mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

close(fd);

pid_t pid =fork();

.......

.......

munmap(p,size);

然后在进程中进行对应的操作。此处不再详细写例程。

 

posted @ 2020-08-12 21:11  houlianpi  阅读(921)  评论(0)    收藏  举报