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;
    }
  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13836699.html
Copyright © 2011-2022 走看看