码迷,mamicode.com
首页 > 系统相关 > 详细

父子进程共享内存通信的三种方法

时间:2018-03-18 11:59:35      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:标识符   article   family   content   系统   style   views   共享   shmget   

1.  mmap MAP_ANONYMOUS

在支持MAP_ANONYMOUS的系统上,直接用匿名共享内存就可以,

mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE,   MAP_ANONYMOUS|MAP_SHARED, -1, 0);


2. mmap  /dev/zero

       有些系统不支持匿名内存映射,则能够使用fopen打开/dev/zero文件,然后对该文件进行映射。能够相同达到匿名内存映射的效果。

fd=open("/dev/zero",O_RDWR);
if(fd==-1){
	printf("open /dev/zero null\n");
	return -1;
}
addr=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(addr == NULL){
    printf("mmap error\n");
    return -1;
}


3. shmget shmat shmctl

shmget 是老式的system V 共享内存模式,非常多系统都支持这样的方法。

int  id;
//得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符
id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT));
if(id==-1){
    perror("shmget:");
    return -1;
}
//连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间。随后可像本地空间一样訪问
addr = shmat(id, NULL, 0);
if(addr == NULL){
    perror("shmat:");
    return -1;
}
//完毕对共享内存的控制
if(shmctl(id, IPC_RMID, NULL)==-1){
    perror("shmctl:");
    return -1;
}

父子进程共享内存通信的三种方法

标签:标识符   article   family   content   系统   style   views   共享   shmget   

原文地址:https://www.cnblogs.com/llguanli/p/8594543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!