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

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值