Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践

简介: Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践

POSIX共享内存概述

共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输。

这种高效率带来的问题是,我们必须用其他辅助手段来同步进程对共享内存的访问,否则会产生竞态条件。

因此,共享内存通常和其他进程间通信方式一起使用。
Linux下有三种共享内存的IPC技术:System V共享内存、共享文件映射(mmap)、POSIX共享内存。 本文只介绍POSIX共享内存。

POSIX共享内存和POSIX消息队列,有名信号量一样都是具有随内核持续性的特点。


POSIX共享内存流程

  1. 指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个已存在的共享内存区对象.
  2. 调用mmap把这个共享内存区映射到调用进程的地址空间.

和内存映射文件进行通信的使用上差别在于mmap描述符参数获取方式不一样

如下图所示:


POSIX共享内存相关接口

  • 创建/打开共享内存区对象
#include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t mode);//成功返回非负的描述符,失败返回-1

参数:

name:POSIX IPC的名字,前面关于POSIX进程间通信都已讲过关于POSIX IPC的规则,这里不再赘述。

oflag:操作标志,包含:O_RDONLY,O_RDWR,O_CREAT,O_EXCL,O_TRUNC。其中O_RDONLY和O_RDWR标志必须且仅能存在一项。

mode:用于设置创建的共享内存区对象的权限属性。和open以及其他POSIX IPC的xxx_open函数不同的是,该参数必须一直存在,如果oflag参数中没有O_CREAT标志,该位可以置0;

注意:

这里的name不能写成/tmp/aaa.sem这样的格式,因为在linux下,sem都是创建在/dev/shm目录下。

你可以将name写成“/mysem”或“mysem”,创建出来的文件都是“/dev/shm/sem.mysem”,千万不要写路径。也千万不要写“/tmp/mysem”之类的。

返回值:

    若成功,返回指向信号量的指针

    若失败,返回SEM_FAILED

  • 删除共享内存区对象
int shm_unlink(const char *name);
//shm_unlink用于删除一个共享内存区对象,跟其他文件的unlink以及其他POSIX IPC的删除操作一样,对象的析构会到对该对象的所有引用全部关闭才会发生。

参数:

name: 共享内存区对象的名字

返回值:

    若成功,返回0

    若失败,返回-1


POSIX共享内存使用例程

  • 创建共享内存区,并写入
   
    int     shm_fd   = 0;
    char *  shm_data = NULL;  
    char    shm_buf[1024]={0};
  
    shm_fd = shm_open("shm-update", O_CREAT|O_RDWR, 0777);
 
    if (shm_fd < 0)
    {
      perror("fail to shm_open");
    }
    else
    {
      //调整确定文件共享内存的空间
      ftruncate(shm_fd, 1024);
      if(ftruncate(shm_fd, 1024)== -1)
      {
          perror("ftruncate shm_fd failed");
      }
      //映射目标文件的存储区
      shm_data = mmap(NULL,1024, PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, SEEK_SET);
      if(NULL == shm_data)
      {
        perror("fail to mmap");
      }
    }
 
    shm_buf[0]='1';
    memcpy(shm_data,shm_buf,sizeof(shm_buf));
  • 打开共享内存区,并读取
       
    int     shm_fd   = 0;
    char *  shm_data = NULL;  
 //   char    shm_buf[1024]={0};
 
    shm_fd = shm_open("shm-update", O_RDWR, 0777);
 
    if (shm_fd < 0)
    {
          perror("fail to shm_open");
    }
    else
    {
      //调整确定文件共享内存的空间
      ftruncate(shm_fd, 1024);
      if(ftruncate(shm_fd, 1024)== -1)
      {
          perror("fail to ftruncate");
      }
      //映射目标文件的存储区
      shm_data = mmap(NULL,1024, PROT_READ, MAP_SHARED, shm_fd, SEEK_SET);
      if(NULL == shm_data)
      {
          perror("fail to mmap");
      }
    }
 
    printf("shm_buf:%s-%d",shm_data,*shm_data);


目录
相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
9月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
854 0
Linux内存问题排查命令详解
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
548 16
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1938 23
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
259 20
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
488 27
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
229 0
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
290 0
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
516 4
|
11月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
3247 0