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);


目录
相关文章
|
6月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
131 0
|
6月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
199 0
|
6月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
133 0
|
Linux Shell 调度
【Linux】7. 进程概念
【Linux】7. 进程概念
165 3
|
10月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
7月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
143 20
|
6月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
179 0
|
9月前
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
344 4
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
存储 Linux Shell
Linux进程概念(上)
冯·诺依曼体系结构概述,包括存储程序概念,程序控制及五大组件(运算器、控制器、存储器、输入设备、输出设备)。程序和数据混合存储,通过内存执行指令。现代计算机以此为基础,但面临速度瓶颈问题,如缓存层次结构解决内存访问速度问题。操作系统作为核心管理软件,负责资源分配,包括进程、内存、文件和驱动管理。进程是程序执行实例,拥有进程控制块(PCB),如Linux中的task_struct。创建和管理进程涉及系统调用,如fork()用于创建新进程。
294 3
Linux进程概念(上)