• Linux共享内存


    • 共享内存:进程直接访问共享内存,由使用者进行访问控制(互斥等)

    • 使用ipcs命令查看系统共享内存

    POSIX 共享内存

    有名共享内存

    • 多个进程通过共享内存的名字来获取同一块共享内存,实现共享
    #include 
    #include        //memory management
    #include           //include O_* macros
    #include 
    #include 
    
    struct shared_data_t {
        int32_t data;
    };
    
    #define SHARED_MEM_NAME     "my_shared_memory"
    
    int main()
    {
        /*
         * 创建共享内存,其实就是一个共享文件
         * name: 不能写成/tmp/aaa.sem这样的格式,因为在linux下,sem都是创建在/dev/shm目录下
         * oflag:操作标志,包含: O_RDONLY,O_RDWR,O_CREAT,O_EXCL,O_TRUNC
         * mode: 设置创建的共享内存区对象的权限属性
         * return: 共享内存的文件描述符
         */
        int shm_fd = shm_open(SHARED_MEM_NAME,O_CREAT | O_RDWR,0666);
    
        //将文件的大小修改为length
        ftruncate(shm_fd, sizeof(struct shared_data_t));
    
        //将共享文件映射到进程内存空间
        struct shared_data_t* data = mmap(NULL, 1024, PROT_READ | PROT_WRITE,
             MAP_SHARED, shm_fd, 0);
        if(data == MAP_FAILED)
        {
            printf("mmap failed!\n");
        }
    
        data->data = 12;
    
        //解除内存的映射
        munmap(data, sizeof(struct shared_data_t));
    
        //删除共享内存
        shm_unlink(SHARED_MEM_NAME);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    匿名共享内存

    • 通过memfd_create()创建一个匿名共享内存,通过UNIX Socket的控制消息CMSG将该文件描述符fd传递给其它进程,其它进程对该fd进行mmap操作可以的得到共享内存得地址,从而实现内存的共享。
    • man memfd_create查看函数具体说明

    System V 共享内存

    #include 
    #include 
    
    #define PATH_NAME "./"
    #define PROJ_ID		0x666
    int main()
    {
    	//生成一个key来唯一标识一个共享内存
    	key_t key = ftok(PATH_NAME, PROJ_ID);
    
    	//根据key创建一个共享内存,key要唯一
    	int shmid = shmget(key, 4096, IPC_CREAT | IPC_EXCL);
    
    	//将共享内存连接到进程地址空间,返回共享内存的地址
    	char* shmaddr = shmat(shmid, NULL, 0);
    	
    	shmaddr = "hello, shared memory!";
    	
    	//取消共享内存和进程的连接
    	shmdt(shmaddr);
    	
    	//删除共享内存
    	shmctl(shmid, IPC_RMID, NULL);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    使用CMake创建CUDA工程
    单片机实验(二)
    21.[STM32]I2C协议弄不懂,深挖时序图带你编写底层驱动
    dubbo命令行
    [AUTOSAR][诊断管理][ECU][$14] 清除诊断相关信息
    Redis数据类型——set类型数据交并差操作
    4.Python建造者模式
    Qt+OpenCV读取摄像头视频、本地视频、网络视频流Demo
    软件流程和管理(四):Communication Management
    助力智慧交通,开发构建道路交通场景下智能车辆检测识别系统
  • 原文地址:https://blog.csdn.net/AcTarjan/article/details/134408065