• c共享内存


    共享内存实现

    共享内存实质是将内核中的一块内存映射到进程中的内存,操作本地内存就相当于操作共享内存。

    使用共享内存步骤:

    1. 创建共享内存
    #include 
    #include 
    /*
    创建共享内存:
    int shmget(key_t key, size_t size, int shmflg);
    函数描述:
    	创建或获得共享内存id	
    一般用法:
    	1、如果共享内存已经存在:
    		key_t key = 0x1234;
    		int shmId = shmget(key, 0, 0);
    	2、如果共享内存不存在:
    		int shmId = shmget(key, 100, IPC_CREAT|IPC_EXCL|0755);
    	3、如果不知道到底存不存在:
    		int shmId = shmget(key, 100, IPC_CREAT|0755);
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 关联共享内存
    #include 
    #include 
    
    /*
    连接共享内存:
    void *shmat(int shmid, const void *shmaddr, int shmflg);
    函数描述:
    	连接共享内存
    参数:
    	shmid: shmget函数返回的共享内存的id值
    	shmaddr: 传NULL,表示让内核分配地址
    	shmflg: 
    		SHM_RDONLY:只能对共享内存进行读操作
    		0:可读可写
    返回值:
    	成功:返回关联共享内存的地址
    	失败:(void*)(-1)
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1. 使用共享内存–读写共享内存
    2. 断开与共享内存的关联
    #include 
    #include 
    /*
    int shmdt(const void *shmaddr);
    参数:
    	shmaddr: shmat返回的内存地址
    返回值:
    	成功:返回0
    	失败:返回-1,并设置errno
    
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 删除共享内存
    #include 
    #include 
    /*
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    函数描述:
    	设置或删除共享内存
    参数:
    	shmid:shmget函数返回的共享内存的id值
    	cmd:
    		IPC_STAT:获得共享内存的状态信息
    		IPC_SET:设置共享内存信息
    		IPC_RMID:删除共享内存
    	buf:
    		若cmd为IPC_RMID, 则buf为NULL
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    示例:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main()
    {
        // 创建共享内存 int shmget(key_t key, size_t size, int shmflg);
        key_t key = 0x12345678;
        int nShmId = shmget(key, 1024, IPC_CREAT | 0664);
        if (0 > nShmId)
        {
            perror("shmget error");
            return -1;
        }
    
        // 关联共享内存 void *shmat(int shmid, const void *shmaddr, int shmflg);
        void *pShmAddr = shmat(nShmId, NULL, 0);
        if ((void *)(-1) == pShmAddr)
        {
            perror("shmat error");
            return -1;
        }
    
        // 读写共享内存
        memcpy(pShmAddr, "hello world", sizeof("hello world"));
        printf("shmId: %d, shmAddr: %p, content: %s\n", nShmId, pShmAddr, pShmAddr);
    
        puts("按任意键:\n");
        getchar();
    
        // 断开共享内存关联 int shmdt(const void *shmaddr);
        if (-1 == shmdt(pShmAddr))
        {
            perror("shmdt error");
            return -1;
        }
    
        puts("按任意键:\n");
        getchar();
    
        // 删除共享内存 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
        if (-1 == shmctl(nShmId, IPC_RMID, NULL))
        {
            perror("shmctl error");
            return -1;
        }
    
        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
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    Cis-[Pt-1,3-Propanediamine]-2-Me-Tetrazine/IC-MethylTetrazine四嗪的性质
    Taro中添加小程序 “lazyCodeLoading“: “requiredComponents“,
    面试经典-15-跳跃游戏 II
    Vue08/Vue 路由重定向、Vue路由404页面、Vue路由hash history
    Qt | TCP服务器端框架搭建
    mermaid - markdown的mermaid语法解析渲染
    东南电子开启申购:客户集中度较高,预计上市时市值约18亿元
    【云栖2023】林伟:大数据AI一体化的解读
    Kotlin第九弹:深入理解 Kotlin 泛型
    限流技术分析
  • 原文地址:https://blog.csdn.net/qq_32622799/article/details/132701957