【Linux】共享内存实现进程间通信

简介: 【Linux】共享内存实现进程间通信

实现通信的原理:

       我们创建的每个进程都有自己的进程地址空间,但是这里面的数据的地址不是真正的数据的地址,真正的地址是在我们的物理内存上的

  共享内存实现通信就和他的名字一样,是共享的进程们都能够看的见,那这片内存当然也是开辟在物理内存上的,进程的进程地址空间 和 物理内存中间,存在一个页表,这个页表也就是帮我们实现地址转换的,同时也能起到解耦的作用。

     当我们两个进程的页表都与物理内存上的一片空间建立映射时,是不是也就让两个进程看到了同一份内存空间呢


shmget():

       我们要在物理内存中申请一片空间,还要让两个进程能够看见,那肯定需要一个特殊的值呐,当两个进程拿到同一个值的时候是不就有办法看到同一片资源,这个值为 key值

240c9d485b6a4fce826ce014edc9e053.jpg

        shmget()函数是一个申请共享内存的函数,给shmget()函数传入key值可以获得相应的IPC对象标识符,这里的 IPC对象标识符 和 IPC键值(key值) 是两个不同的东西,IPC对象标识符是建立在IPC键值之上的,我们产生的IPC键值就可以供我们后面的一些对共享内存进行函数使用


ftok():

ac9a2ad0e4f44242be40422f11f69fa8.jpg


   这个函数就是我们创建自己独一无二的 IPC键值 的函数 函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键值

   pathname:指定的文件,此文件必须存在且可存取

              proj_id: 自己设定的一个值,不能为0

       这个key值是根据你传的参数pathname和proj_id来形成的,操作系统会根据两者合成key值。


两个进程就可以传入同样的参数就可以获得相同的IPC键值,再使用shmget()函数访问到同一块内存空间片段。


key为IPC_PRIVATE,内核保证创建一个新的、唯一的IPC对象,IPC标识符与内存中的标识符不会冲突。
       IPC_PRIVATE为宏定义,其值等于0。
 


shmget()函数第二个参数 size:这个是申请的内存的大小

申请的空间大小也是建议以4kb的倍数申请,如果申请4300字节,那他会给你8000字节,但是你最终只能使用4300字节


shmget()函数第三个参数是我们申请空间时的权限设置

shmget()函数在使用时是可以设置权限的,IPC_CREAT 表示没有就创建,有就返回该对象。可如果加上IPC_EXCL那么没有就创建,有的话报错(errno=EEXIT)、ipc_perm中的mode的定义也会收到影响。最终的权限是由我们传的参数(0666)和它已有的mode或运算获得的  


shmat():

这个是用来与共享内存产生关联的函数 返回共享内存段的地址 ,申请完空间还应该与他关联起来才能访问

 void* shmat(int shmid(IPC键值),const void* shmaddr,int shmflag);

       第二个参数为nullptr表示为默认关联位置,第三个参数为0 表示默认为允许读写操作


shmdt():

shmdt()断开关联

       shmdt(const void* shmaddr);

这个参数需要传入 shmat()函数的返回的地址。


shmctl():

       这个函数是用来删除共享内存的,共享内存的生命周期是跟随内核的,即使有个进程退出了,它也是依旧存在的(可以在终端ipcs -m 查看是否存在;ipcrm -m shmid移除用shmid标识的共享内存段),如果不显示的删除,只能通过kernel(os)重启来解决。  

8f4f9685aa344a60ba8552b6f5fb020f.jpg

      shmat(int shmid,const void* shmaddr,int shmflag);

       第二个参数为nullptr表示为默认关联位置,第三个参数为0 表示默认为允许读写操作

目录
相关文章
|
5天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
53 34
|
9天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
40 16
|
12天前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
102 48
|
1月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
138 14
|
1月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
114 17
|
1月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
122 20
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
|
2月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
3月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
38 3