zoukankan      html  css  js  c++  java
  • POSIX之共享内存

    shm_write.c:

    #include<stdio.h>
    #include<stdlib.h>
    #include <stdlib.h> 
    #include <unistd.h>
    #include <sys/file.h>
    #include <sys/mman.h> 
    #include <sys/wait.h>
    void p_error(const char* str)
    {
        perror(str);
        exit(1);
    }
    int main(int argc,char* argv[])
    {
        int ret;
        size_t mem_size = sysconf(_SC_PAGE_SIZE);
        int fd=shm_open("/mymen", O_CREAT|O_TRUNC|O_RDWR,0666);
        if(fd==-1)
        {
            perror("创建共享内存失败
    ");
        } 
        printf("创建共享内存成功
    ");
    
    //第二个参数用来指定截取共享内存空间大小
        ftruncate(fd,mem_size);
    
        void* ptr=mmap(0,mem_size,PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    
    /*
    //第一个参数为0表示系统会自动寻找空闲空间作为开始地址
    //void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
    flags: 指定映射对象的类型,映射选项和映射页是否可以共享。
    它的值可以是一个或者多个以下位的组合 体 MAP_SHARED 与其它所有映射这个对象的进程共享映射空间。
    对共享区的写入,相当于输出到文 件。 直到msync()或者munmap()被调用,文件实际上不会被更新。 
    MAP_PRIVATE 建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。
    这个标志和以 上标志是互斥的,只能使用其中一个。 MAP_LOCKED 锁定映射区的页面,从而防止页面被交换出内存。
    */
    
    //成功返回共享内存地址,失败返回MAP_FAILED
        if (ptr == MAP_FAILED) 
        {
            p_error("内存映射失败
    ");
        }
    
        close(fd);
        
        int i=0;
    
        while(i<10)
        {
            sprintf((char*)ptr,"data%d",i++);
            printf("写入的数据为:%s
    ",(char*)ptr);    
            sleep(1);
    
        }
    
    ret = munmap(ptr, mem_size); //卸载共享内存
    if (ret != 0)
     {
         p_error("卸载内存失败");
     }
    //  ret = shm_unlink("/mymen");
    //   if (ret != 0) 
    // {
    //     p_error("删除共享内存");
    // } 
    
    
        return 0;
    }

    shm_read.c:

    #include<stdio.h>
    #include<stdlib.h>
    #include <stdlib.h> 
    #include <unistd.h>
    #include <sys/file.h>
    #include <sys/mman.h> 
    #include <sys/wait.h>
    void p_error(const char* str)
    {
        perror(str);
        exit(1);
    }
    int main(int argc,char* argv[])
    {
        int ret;
        size_t mem_size = sysconf(_SC_PAGE_SIZE);
        int fd=shm_open("/mymen",O_RDONLY,0666);
        if(fd==-1)
        {
            perror("创建共享内存失败
    ");
        } 
        printf("创建共享内存成功
    ");
    
        ftruncate(fd,mem_size);
    
        void* ptr=mmap(0,mem_size,PROT_READ, MAP_SHARED, fd, 0);
        if (ptr == MAP_FAILED) 
        {
            p_error("内存映射失败
    ");
        }
    
        close(fd);
    
    while(ptr++)
    {
            printf("读出的数据为:%s
    ",(char*)ptr);
            sleep(1);
    }
        
    ret = munmap(ptr, mem_size); //卸载共享内存
    if (ret != 0)
     {
         p_error("卸载内存失败");
     }
     ret = shm_unlink("/mymen");
      if (ret != 0) 
    {
        p_error("删除共享内存");
    } 
    
    
        return 0;
    }
  • 相关阅读:
    vue-面试
    使用webpack4搭建一个基于Vue的组件库
    vue 仿今日头条
    如何正确的在项目中接入微信JS-SDK
    vuejs实现折叠面板展开收缩动画
    Vue的watch和computed属性
    Android Studio(十):添加assets目录
    Android Studio(九):引用jar及so文件
    Android Studio(八):Android Studio设置教程
    Android Studio(七):项目从Eclipse到Android Studio迁移
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13836699.html
Copyright © 2011-2022 走看看