• Posix 共享内存区


    要点

    与mmap配合使用
    open与shm_open的区别,open打开磁盘上的普通文件,shm_open创建和打开的文件在/dev/shm文件夹下,该文件夹对应的是内存
    gcc编译时加参数-lrt
    shm_open的第一个参数名字的形式: /name, 如"/myshm"

    基本函数

    #include <sys/mman.h>
    int shm_open(const char *name, int oflag, mode_t mode);
    int shm_unlink(const char *name);
     
    #include <unistd.h>
    int ftruncate(int fd, off_t length);
     
    #include <sys/types.h>
    #include <sys/stat.h>
    int fstat(int fd,struct stat *buf);
    struct stat{
        ...
        mode_t st_mode;
        off_t st_size;
        ...
    };
    

    shm_open用于创建或打开内存文件
    shm_unlink用于删除内存文件的名字,并不影响已经打开的进程
    ftruncate用于调整内存文件的大小
    fstat用于获取文件的属性

    例子

    用open和shm_open两种方式创建内存共享区;打印父子进程中两个共享区的内存地址

    #include "unpipc.h"
    #include <sys/stat.h>
    #include <sys/mman.h>
     
    int main(int argc, char *argv[]){
        int fd1,fd2,*ptr1,*ptr2;
        pid_t childpid;
        struct stat st;
     
        if(argc != 2)
            err_quit("usage: ./shm <name>");
        shm_unlink(argv[1]);
        fd1=shm_open(argv[1],O_RDWR|O_CREAT|O_EXCL,0644);
        ftruncate(fd1,sizeof(int));
        fd2=Open("./shm.c",O_RDONLY,0);
        fstat(fd2,&st);
     
        if((childpid=Fork()) == 0){
            ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
            ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
            printf("child: shm ptr=%p, shm.c ptr=%p
    ",ptr1,ptr2);
            sleep(5);
            printf("shared memory integer=%d
    ",*ptr1);
            exit(0);
        }
     
        ptr1=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
        ptr2=mmap(NULL,st.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,0);
        printf("father: shm ptr=%p, shm.c ptr=%p
    ",ptr1,ptr2);
        *ptr1=777;
        waitpid(childpid,NULL,0);
     
        exit(0);
    }
    
  • 相关阅读:
    20159320《网络攻防实践》第4周教材学习总结
    20159320《网络攻防实践》第3周学习总结
    20159320 《网络攻防实践》第3周教材学习总结
    20159320 《网络攻防实践》第3周视频学习总结
    网络攻防学习心得一(20159320)学习小结
    Android 开发环境搭建以及编译
    iTOP-4412 开发板镜像的烧写
    Ubuntu 的基本操作
    iTOP-4412 平台基础软件的安装和学习
    几个关于嵌入式芯片的硬件系统
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5836252.html
Copyright © 2020-2023  润新知