• 进程间通信-共享内存


    • void *mmap(void *addr,size_t len,int prot,int flags, int fd,off_t offset);
      • prot:保护方式
      •     PROT_READ:页面可读
      •     PROT_WRITE:页面可写
      •     PROT_EXEC:  
      •     PROT_NONE:
      • fiags:
      •     MAP_SHARED:
      •     MAP_PRIVATE:变动是私有的
      •     MAP_FIXED:准确解释addr
      •     MAP_ANONYMOUS:建立匿名映射去,不涉及文件
      • mmap是以页面为单位来反配内存,内存是页面的整数倍
    • int munmmap(int fd,size_t size)
    • int msync(void *addr, size_t len,int flags)
      • flags:
        • MS_ANYNC:执行异步写
        • MS_SYNC:执行同步写
        • MS_INVALIDATR:是高速缓存失效
    • 注意
      • 映射不能改变文件的大小
    • 举个栗子
      •  1 //创建共享内存
         2 #include <sys/mman.h>
         3 #include <unistd.h>
         4 #include <sys/types.h>
         5 
         6 #include <stdlib.h>
         7 #include <stdio.h>
         8 #include <errno.h>
         9 #include <sys/stat.h>
        10 #include <fcntl.h>
        11 
        12 #define ERR_EXIT(m)
        13     do
        14     {
        15         perror(m);
        16         exit(EXIT_FAILURE);
        17     }while(0)
        18 
        19 typedef struct stt
        20 {
        21     char name[4];
        22     int age;
        23 }STU;
        24 
        25 int  main(int argc,char *argv[])
        26 {
        27     if(argc != 2)
        28     {
        29         exit(EXIT_FAILURE);
        30     }
        31 
        32     int fd;
        33     fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666);
        34     if(fd == -1)
        35     {
        36         ERR_EXIT("open");
        37     }
        38     lseek(fd,sizeof(STU) * 5 -1,SEEK_SET);
        39     write(fd,"",1);
        40     STU *p;
        41     p = (STU*)mmap(NULL,sizeof(STU)*5,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
        42     if( p == NULL)
        43         ERR_EXIT("mmap");
        44     char ch = 'a';
        45     int i;
        46     for(i = 0;i< 5;i++)
        47     {
        48         memcpy((p+i)->name,&ch,1);
        49         (p+i)->age= 20 + i;    
        50         ch++;
        51     }
        52     printf("Initlize over!
        ");
        53     munmap(p,sizeof(STU)*5);
        54     printf("exit....
        ");    
        55     return 0;
        56 }
      •  1 //读取共享内存
         2 #include <sys/mman.h>
         3 #include <unistd.h>
         4 #include <sys/types.h>
         5 
         6 #include <stdlib.h>
         7 #include <stdio.h>
         8 #include <errno.h>
         9 #include <sys/stat.h>
        10 #include <fcntl.h>
        11 
        12 #define ERR_EXIT(m)
        13     do
        14     {
        15         perror(m);
        16         exit(EXIT_FAILURE);
        17     }while(0)
        18 
        19 typedef struct stt
        20 {
        21     char name[4];
        22     int age;
        23 }STU;
        24 
        25 int  main(int argc,char *argv[])
        26 {
        27     if(argc != 2)
        28     {
        29         exit(EXIT_FAILURE);
        30     }
        31 
        32     int fd;
        33     fd = open(argv[1], O_RDWR);
        34     if(fd == -1)
        35     {
        36         ERR_EXIT("open");
        37     }
        38 
        39     STU *p;
        40     p = (STU*)mmap(NULL,sizeof(STU)*5,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
        41     if( p == NULL)
        42         ERR_EXIT("mmap");
        43     char ch = 'a';
        44     int i;
        45     for(i = 0;i< 5;i++)
        46     {
        47         printf("name = %s, age = %d
        ",(p+i)->name,(p+i)->age);
        48     }
        49     munmap(p,sizeof(STU)*5);
        50     printf("exit....
        ");    
        51     return 0;
        52 }
    • System V共享内存

      • 随内核持续(同消息队列)
      •  1 //共享内存函数
         2 #include <sys/ipc.h>
         3 #include <sys/shm.h>
         4 
         5 //创建或者访问一个共享内存
         6 int shmget(key_t key,size_t size,int shmflg);
         7 //映射
         8 void* shmat(int shmid,const void *shmaddr,int shmflg);
         9 //脱离
        10 int shmdt(const void *shmaddr);
        11 //控制
        12 int shmctl(int shimid,int cmd, struct shmid_ds *buf);
    作者:长风 Email:844064492@qq.com QQ群:607717453 Git:https://github.com/zhaohu19910409Dz 开源项目:https://github.com/OriginMEK/MEK 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。 如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
  • 相关阅读:
    公司实习职位与要求
    段子
    Python 练习项目1 弹球游戏
    精准控制PWM脉冲的频率和数量
    ST Link 调试问题总结
    验证
    大道至简(第六章)读后感
    动手动脑
    大道至简(第五i章)读后感
    数组课后作业
  • 原文地址:https://www.cnblogs.com/zhaohu/p/8998649.html
Copyright © 2020-2023  润新知