美文网首页
Linux--共享内存

Linux--共享内存

作者: 锈色的栅栏 | 来源:发表于2024-11-13 08:50 被阅读0次

1、共享内存的概述

共享内存允许两个或者多个进程共享给定的存储区域。

共享内存的特点
1、共享内存是进程间共享数据的一种最快的方法。 一个进程向共享的内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容
2、使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。 若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这些数据。
共享存储区的最小字节数:1
共享存储区的最大字节数:32M
共享存储区的最大个数:4096
每个进程最多能映射的共享存储区的个数:40962、

API

1、获得一个唯一共享存储标识符

#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key_t key, size_t size,int shmflg);

功能:
        创建或打开一块共享内存区
参数:
    key:IPC键值
    size:该共享存储段的长度(字节)
    shmflg:标识函数的行为及共享内存的权限。
        IPC_CREAT:如果不存在就创建
        IPC_EXCL:如果已经存在则返回失败
        位或权限位:共享内存位或权限位后可以设置共享内存的访问权限,格式和
        open函数的mode_t一样,但可执行权限未使用。
返回值:
        成功:返回共享内存标识符。
        失败:返回-1
使用shell命令操作共享内存: 查看共享内存 ipcs -m 删除共享内存 ipcrm -m shmid

2、建立进程的虚拟内存 和 物理内存大的映射

#include<sys/types.h>
#include<sys/shm.h>
void* shmat(int shmid,const void*shmaddr ,int shmflg);

功能:
    将一个共享内存段映射到调用进程的数据段中。
参数:
        shmid:共享内存标识符。
        shmaddr:共享内存映射地址(若为NULL则由系统自动指定),推荐使用NULL。

            shmflg:共享内存段的访问权限和映射条件
            0:共享内存具有可读可写权限。
            SHM_RDONLY:只读。
            SHM_RND:(shmaddr非空时才有效)
            没有指定SHM_RND则此段连接到shmaddr所指定的地址上(shmaddr必需页对齐)。
            指定了SHM_RND则此段连接到shmaddr- shmaddr%SHMLBA 所表示的地址上。
返回值:
        成功:返回共享内存段映射地址
        失败:返回 -1
注意:
   shmat函数使用的时候第二个和第三个参数一般设为NULL和0,即系统自动指定共享内存地址,并且
    共享内存可读可写

3、解除共享映射区:

#include<sys/types.h>
#include<sys/shm.h>
int shmdt(const void *shmaddr);

功能:
        将共享内存和当前进程分离(仅仅是断开联系并不删除共享内存)。
参数:
        shmaddr:共享内存映射地址。
返回值:
    成功返回 0,失败返回 -1。

4、共享内存控制:

#include<sys/ipc.h>
#include<sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid_ds *buf);

功能:
    共享内存空间的控制。
参数:
    shmid:共享内存标识符。
    cmd:函数功能的控制。
    buf:shmid_ds数据类型的地址,用来存放或修改共享内存的属性。
    cmd:函数功能的控制
        IPC_RMID:删除。
        IPC_SET:设置shmid_ds参数。
        IPC_STAT:保存shmid_ds参数。
        SHM_LOCK:锁定共享内存段(超级用户)。
        SHM_UNLOCK:解锁共享内存段。
返回值:
       成功返回 0,失败返回 -1。

示例代码

#include<stdio.h> 
#include<sys/types.h>//ftok 
#include <sys/ipc.h> //ftok
#include <sys/shm.h> //shmget   
#include<string.h>   
int main(int argc,char const *argv[])
{   
        //获取唯一的key 
        key_t key = ftok("/", 2022); 
        //获取共享内存的标示(分配物理内存) 
        int shm_id = shmget(key, 32, IPC_CREAT | 0666); 
        //将虚拟内存 和 物理内存 建立映射 
        char *buf = (char *)shmat(shm_id, NULL, 0); 
        //操作虚拟内存 
        strcpy(buf, "hello shm"); 
        //释放映射 
        shmdt(buf); 
        return 0;   
}

相关文章

  • python多进程和多线程、内存共享和进程池、多线程编程

    @[toc] 内存共享 通过Value,Array实现内存共享返回一个从共享内存上创建的ctypes对象从共享内存...

  • 跨进城间通信的经典实现

    共享内存(Shared Memory)shmget(获取/创建内存共享区,key)shmat(映射内存共享区)sh...

  • 共享内存数据库--设计及实现

    共享内存: 共享内存是三种IPC机制中的一种.共享享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个...

  • 共享内存原理

    Linux的2.2.x内核支持多种共享内存方式,如mmap()系统调用,Posix共享内存,以及系统V共享内存。 ...

  • Handler

    Handler,共享内存的方案,与wait/notify相比使用非常简单 内存共享,线程之间的通信就是共享内存 H...

  • 进程通信:共享内存,套接字

    进程通信方式:共享内存 共享内存本质上就是每个进程将虚拟地址空间指向共享内存块中,当一个进程往一个共享内存快中写入...

  • JVM第二天-volatile final synchroniz

    1.JAVA内存模型 简单的讲,Java 内存模型将内存分为共享内存和本地内存。共享内存又称为堆内存,指的就是线程...

  • 033 Android多进程-共享内存

    1 什么是共享内存? 1.1 什么是共享内存? 共享内存是系统处于多个进程之间通讯的考虑,而预留的一块内存区。 共...

  • 8.31

    Android匿名共享(Ashmen)Android特有内存共享机制,实现了进程间的内存共享。基于ashmen设备...

  • boost 内存共享跨线程

    写一个模块用于跨进程内存共享,boost 很好的提供了在共享内存上的内存分配器,可以在共享内存中创建容器,然后跨进...

网友评论

      本文标题:Linux--共享内存

      本文链接:https://www.haomeiwen.com/subject/qdfzdjtx.html