父子进程使用mmap进程间通信

munmap函数的使用方式:

int munmap(void *addr,size_t length);        释放映射区

        addr:mmap 的返回值

        length:大小

使用注意事项:

1.用于创建映射区的文件大小为0,实际指定非0大小创建映射区,出“总线错误”。

2.用于创建映射区的文件大小为0,实际控制0大小创建映射区,出“无效参数”。

3.用于创建映射区的文件读写属性为,只读。映射区属性为    读、写。出“无效参数”。

4.创建映射区,需要read权限。mmap的读写权限,应该<=文件的open权限。只写不行。

5.文件描述fd,在mmap创建映射区完成即可关闭。后续访问文件,用地址访问。

6.offset必须是4096的整数倍。(MMU映射的最小单位4k)

7.对申请的映射区内存,不能越界访问。

8.munmap用于释放的 地址,必须是mmap申请返回的地址。

9.映射区访问权限为“私有”MAP_PRIVATE,对内存所做的所有修改,只在内存有效,不会反应到物理磁盘上。

10.映射区访问权限为“私有”MAP_PRIVATE,只需要open文件时,有读权限,用于创建映射区即可。

mmap函数的保险调用方式:

        1.fd=open("文件名",O_RDWR);

        2.mmap(NULL,有效文件大小,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

 

父子进程使用mmap进程间通信:

  

     父进程先创建映射区。open(O_RDWR) mmap(MAP_SHARED);

        指定MAP_SHARED权限。

        fork()创建子进程。

        一个进程读,另外一个进程写。

无血缘关系进程间mmap通信:

  

     两个进程 打开同一个文件,创建映射区。

        指定flags为MAP——SHARED。

        一个进程写入,另一个进程读出。

        【注意】:无血缘关系进程间通信。mmap:数据可以重复读取。

                                                                fifo:数据只能一次读取。

代码示例:

1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<fcntl.h>
  5 #include<sys/mman.h>
  6  #include<errno.h>
  7 #include<unistd.h>
  8 #include<pthread.h>
  9
10 struct student{
11     int id;
12     char name[256];
13     int age;
14 };
15
16 void sys_err(const char *str){
17     perror(str);
18     exit(1);
19 }
20
21 int main(int argc,char *argv[])
22 {
23     struct student stu;
24     struct student *p;
25     int fd;
26
27     fd=open("test_map",O_RDONLY);
28     if(fd==-1)
29     {
30         sys_err("open error");
31     }
32
33     p=mmap(NULL,sizeof(stu),PROT_READ,MAP_SHARED,fd,0);
34     if(p==MAP_FAILED)
35     {
36         sys_err("mmap error");
37     }
38     close(fd);
39
40     while(1){
41         printf("id=%d,name=%s,age%d\n",p->id,p->name,p->age);
42         sleep(1);
43     }
44     munmap(p,sizeof(stu));
45     return 0;
46 }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值