首页
学习
活动
专区
圈层
工具
发布

Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)

这种情况下,如果进程没有主动释放共享内存,那么共享内存将一直存在于系统中,直到以下情况之一发生才会被释放: 代码删除:可以通过调用shmctl函数来删除共享内存,释放其资源。...返回值: 如果成功,ftok() 函数返回一个唯一的键值(key_t 类型),该键值可以在后续的 IPC 调用(如 shmget(), msgget(), semget() 等)中用作参数。...shmget():创建或获取共享内存 shmget() 系统调用用于创建一个新的共享内存对象,或者如果它已存在,则返回该对象的标识符。...要给共享内存提供唯一性的标识 key便是那个唯一性标识符。那么为什么这个key要由我们用户来传入呢? 如果然系统生成,将值返回让我们得到。那我们如何给另外一个进程呢?...那怎么知道是什么类型呢?

60110

Linux进程通信——共享内存

这里再次创建共享内存会报错。 那么key的意义是什么呢? 首先清楚,OS一定可能会存在很多共享内存,并且本质就是申请一块空间,能进行唯一性标识最重要。...这就是创建key的含义,key是要通过shmget设置进入共享内存属性中的,用来表示该共享内存在内核中的唯一性。 那么用来接收shmget返回值的变量有什么意义呢?...那么如何去关联呢? shmdt 其实就是调用去卸载当前进程共享内存的地虚拟地址空间,参数就是shmat的返回值。...信号量和这些有什么关系呢信号量主要就是完成同步互斥和原子性的! 理解信号量 那么在深入了解一下信号量是什么,信号量虽然是一个计数器,但是不可能是一个进程的全局变量。...那么如果一个信号量初始值为1是什么意思呢? 这就说明这个公共资源是一个整体资源了。 这个也叫做二元信号量,主要提供互斥作用的。 信号量的接口与结构 申请信号量。

6.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】从零开始认识进程间通信 —— 共享内存

    IPC_EXCL :单独使用没有意义!!!只有和IPC_CREAT 组合才有意义! IPC_CREAT | IPC_EXCL : 如果要创建的共享内存不存在,就新创建一个。...那么IPC_CREAT | IPC_EXCL 就用来创建共享内存,IPC_CREAT 这个用来获取共享内存! 那么进程如何知道操作系统内存在共享内存呢???...可以猜测:应该是通过struct shm属性里的用于标识共享内存的唯一性的字段!那这个字段如果让操作系统OS自动生成(类似PID)行不行呢?如果是OS创建的,那其他进程如何获取呢?...为什么进程退出了,共享内存不会退出呢???第一次成功创建,第二次就报错–共享内存无法创建!说明共享内存不随着进程的释放而自动释放!...管道是有保护机制的, 可以使用管道来辅助,管道来负责告诉进程是否写完读完。 我们在访问共享内存的时候没有使用任何系统调用! 共享内存是所有进程IPC中速度最快的,共享内存大大减少了数据的拷贝次数!

    59310

    Linux进程通信--共享内存

    如何实现共享内存呢? 假设目前有两个进程,进程A和进程B。...标志位IPC_EXCL:单独使用没有意义,一般和IPC_CREAT组合才有意义。 标志位IPC_EXCL | IPC_CREAT:如果创建的共享内存不存在,就创建该共享内存;如果存在,出错返回。...也就是说,成功返回了,那么创建的共享内存就是全新的。 进程如何知道该共享内存存不存在?...它用来区分同一个路径名下不同IPC对象的不同标识符。 返回值: ftok 函数返回一个key_t类型的键值,如果发生错误则返回 -1,并设置 errno 来指示错误的原因。...*buf); 参数: shmid:由shmget返回的共享内存标识码 cmd:将要采取的动作(有三个可取值) buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 删除共存内存函数代码演示 删除共享内存的函数接口写在上述析构函数中

    1.3K10

    【Linux修炼】16.共享内存

    除了上一节中讲到的公共文件的方案,还有什么其他方案呢?...即在用户的角度,如果创建成功,一定是一个新的shm! shmget返回值: 记住他是一个标识符就够用了,得到的是共享内存的标识符。...之前谈到过,key是什么不重要,能进行唯一性的标识最重要,因此创建共享内存的时候,是如何保证共享内存在系统中是唯一的呢?...为什么有了key还需要shmid呢?通过key和shmid的区分,能够面向系统层面和用户层面,这样能够更好的进行解耦,以免内核中的变化影响到用户级。...,由于我们新增了0600即拥有者的读写权限,perm也就显示了600,此外nattch的链接数量也变成了1,这说明有一个进程和这个共享内存关联起来了,而我们所演示的就是我自己的进程与共享内存进行了关联。

    4.6K00

    【Linux】SystemV IPC

    毫无疑问,key 在共享内存的描述对象中! 那么第一次创建的时候,这个 key 怎么有呢?...也就是说,它一定能让我们获取到共享内存的属性,那么我们要查看共享内存的属性还是修改还是什么呢?...接下来我们解释一个现象,如果我们有多个进程,都往显示器打印,也就是在并发打印,为什么显示器上的消息会出现错乱混乱或者和命令行混在一起呢?...最后,那么信号量为什么是进程间通信的一种呢?共享内存和消息队列都可以传数据,所以叫通信,那么信号量没有传数据为什么是进程间通信的一种呢?...严格意义上讲,如果把通信定义成数据互相传送数据,那么信号量就不应该是通信的一种,但是通信不仅仅是进行传送数据,互相协同也是!那么要协同,本质也是通信,信号量首先要被所有的通信进程看到!

    53410

    进程间通信:system V共享内存

    同一时刻可能会存在多组进程,都在使用不同的共享内存来进行通信。也就是说在操作系统中会有多个共享内存同时存在,那么按照以往的经验以及操作系统的习惯,这些共享内存是否需要管理呢?...如何保证两个不同的进程拿到的是一块共享内存 当通过ftok得到key值并传入shmget后,即可得到一块共享内存,shmget函数的返回值就是用户层面上对于共享内存的唯一表示符。...,也就是shmget的返回值,不是key,key是给系统使用的。...如何理解返回值,我们得到这个起始的虚拟地址有什么用?...无同步机制 同步机制是什么 同步机制(Synchronization Mechanism)是多进程或多线程编程中用来协调多个执行单元(进程或线程)访问共享资源的一种方法。

    42110

    【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

    共享内存不是简单的一段内存空间,它也要有描述并管理共享内存的数据结构和匹配算法。 共享内存函数 shmget 函数 该函数是系统调用,操作系统提供系统调用,让我们创建共享内存。...如果存在,就获取该共享内存并返回。 IPC_EXCL:单独使用没意义,只有和IPC_CREAT组合才有意义 IPC_CREAT | IPC_EXCL:如果你要创建的共享内存不存在,就创建。...shmctl 函数 如果不想用指令释放,可以用shmctl 函数进行,如下: 功能:用于控制共享内存 参数 shmid:由shmget返回的共享内存标识码 cmd:将要采取的动作(有三个可取值...返回值:成功返回共享内存的起始地址;失败返回-1 shmdt 函数 功能:将共享内存段与当前进程脱离 参数 shmaddr: 由shmat所返回的指针 返回值:成功返回0;失败返回-1...system V消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列的接口的使用跟共享内存函数很像

    58210

    【Linux】systemV共享内存

    一、工作原理 操作系统在物理内存上申请一块空间,然后将申请到的空间通过页表映射到进程地址空间mm_struct的共享区中,然后返回虚拟地址供程序使用,如果多个进程申请的是同一块物理空间,那么它们就可以进行通信...8 位会被使用), 只要这两个才参数一致,那么生成的key值就一定一致 key值是我们少见的由我们自己传参生成的固定的值,Linux在涉及内存方面的时候,通常是操作系统代为处理,这里其实是因为假设我们有两个进程...(key_t key, size_t size, int shmflg); 返回值:成功返回一个非负整数,即该共享内存段的标识码(shmid),失败返回-1 key:key是一个数字,它是不同共享内存让自己具备唯一性的标识...,在调用shmget函数时,虽然创建或获取了共享内存段的标识符,但进程还不能直接访问该共享内存,只有通过shmat函数将共享内存段附加到进程的地址空间后,进程才能像访问普通内存一样访问共享内存段中的数据...:成功返回一个指针,指向共享内存的起始地址,失败返回 -1 shmid:共享内存段的标识符,用于指定要附加的共享内存段,即shmget的返回值 shmaddr:指定共享内存段要附加到的进程地址空间的地址

    1.4K10

    【Linux】「共享内存揭秘」:高效进程通信的终极指南

    2.1.1 创建共享内存创建共享内存时,需要使用到shmget函数int shmget(key_t key,size_t size,int shmflg)返回值:创建成功返回共享内存的shmid,失败返回...关于返回值在OS中,共享内存也拥有自己的数据结构,所以返回值有点类似于文件系统中的fd,用于对不同的共享内存块进行操作。...与open函数的参数2类似,常用的选项有:IPC_CREAT创建共享内存,如果存在则使用已经存在的共享内存。...2.1.4 进程关联共享内存共享内存的开辟就是为给不同的进程同一块空间的,那么我们要怎么给不同的进程看到同一块空间呢?...总结什么共享内存比管道快。共享内存快的原因就在于比管道少了两次IO(输入输出)操作。IO是很慢的,怎么证明呢?

    77220

    Linux进程间通信——使用共享内存

    1、shmget函数 该函数用来创建共享内存,它的原型为: int shmget(key_t key, size_t size, int shmflg); 第一个参数 ,与信号量的semget函数一样...不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(...shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。...试想当written为0时,如果有两个进程同时访问共享内存,它们就会发现written为0,于是两个进程都对其进行写操作,显然不行。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    4.4K20

    初识Linux · 共享内存

    ,将虚拟地址和物理地址完美联系在了一起,那么物理内存里面是否存在进程间通信需要的空间 -- 共享内存呢?...那么新的问题来了:是否存在多个共享内存?如果存在多个共享内存,那么OS是否有必要对共享内存进行管理?如果要实施管理,OS是如何进行管理的?...对于第二个问题,OS肯定是有必要对共享内存进行管理的,不然内存导致的问题由谁来负责呢?...最后一个参数,key,我们首先思考一个问题,开辟了共享内存之后,进程通过什么方式知道共享内存呢?...那么对于函数shmget的返回值的描述是: 返回的值如果成功了,返回的是共享内存的唯一标识符,如果开辟共享内存失败了,返回的就是就是-1。

    1.6K10

    【Linux】system V 共享内存

    可以,其他进程也可以通信 所以在任何时刻,可能有多个共享内存在被使用 系统中一定会存在很多共享内存同时存在 操作系统要不要整体管理所有的共享内存呢?要 操作性系统如何管理多个共享内存呢?...,输入 man shmget 查看 申请一个 系统V的共享内存块 如果创建成功,则会返回共享内存标识符,失败返回-1 ---- size代表申请内存块的大小 shmflg代表 选项 有两个最常用的选项...通过寻找key值来找到A所创建的共享内存 ---- pathname 代表 用户自己设定的路径字符串 proj_id 代表 项目id key值意义为 让创建共享内存的进程可以给新共享内存设置key值 让获取共享内存的进程...将自己和共享内存关联起来 输入 man shmat 指令 at代表 关联 将共享内存和目标值关联起来 返回值为 共享内存的虚拟地址的起始地址 我们不知道应该把共享内存放在虚拟空间的什么地址处...删除共享内存 创建共享内存的进程已经早就退出了,但是共享内存还存在 确认共享内存存在: ipcs ipc作为进程间通信的简写 ipc表示资源 s表示有多个资源 显出来的为ipc通信系统所支持的三种

    1.4K20

    【Linux】进程间通信——System V共享内存

    注意键值key是由用户定义的标识符,不是系统生成的,这是因为进程间需要通过key来确定和使用共享内存,如果是由系统创建的,那么其他进程就无法得知该共享内存的key,从而无法使用。...如果是用户自己定义的,那么用户想让哪个进程使用都可以。 3. 创建与使用   创建System V共享内存段的主要函数有shmget、shmat、shmdt和shmctl。...int shmget(key_t key, size_t size, int shmflg); 该函数用于创建一个新的共享内存段或者获取一个已有的共享内存段。...IPC_EXCL单独使用无意义,通常是和IPC_CREAT搭配使用,IPC_CREAT|IPC_EXCL,使用逻辑运算符或连接:表示如果通过key值标识的共享内存不存在就创建;存在就出错返回。...shmget返回值是一个共享内存标识符,如果出错则返回-1。 注意这个标识符不是key,而是给用户用的一个标识共享内存的标识符。

    58210

    Linux进程间通信之System V

    smhget返回值说明: 若创建成功则返回共享内存的描述符smhid(用户层的,和key不同) 若创建失败则返回 -1 注意key值是需要我们自己传入的,我们可以想传什么就传什么,但key不可重复...传入shmget函数的第三个参数shmflg,常用的组合方式有以下两种: 组合方式 作用 IPC_CREAT 如果内核中不存在键值与key相等的共享内存,则新建一个共享内存并返回该共享内存的句柄;...这两种奇怪的区分到底有什么用呢?...(跟共享内存差不多) msgflg:和shmget的第三个参数一样。 msgget函数返回值介绍: 创建消息队列成功则返回该消息队列的描述符。...sem就为0了,那么这时进程B会被挂起,直到进程A访问共享内存结束后将sem加加,此时才会将进程B唤起,然后进程B再对该共享内存进行访问操作。

    40710

    【Linux】进程间通信(命名管道、共享内存、消息队列、信号量)

    共享内存不是简单的一段内存空间,它也要有描述并管理共享内存的数据结构和匹配算法。 共享内存函数 shmget 函数 该函数是系统调用,操作系统提供系统调用,让我们创建共享内存。...如果存在,就获取该共享内存并返回。 IPC_EXCL:单独使用没意义,只有和IPC_CREAT组合才有意义 IPC_CREAT | IPC_EXCL:如果你要创建的共享内存不存在,就创建。...由shmget返回的共享内存标识码 cmd:将要采取的动作(有三个可取值,如下图) buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值:成功返回0;失败返回-1 传IPC_STAT...返回值:成功返回共享内存的起始地址;失败返回-1 shmdt 函数 功能:将共享内存段与当前进程脱离 参数 shmaddr: 由shmat所返回的指针 返回值:成功返回0;失败返回-...system V消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列的接口的使用跟共享内存函数很像

    43110

    【Linux】IPC 进程间通信(二)(共享内存)

    ,实现数据共享的 共享内存的操作是非进程安全的,多个进程同时对共享内存读写是有可能会造成数据的交叉写入或读取,造成数据混乱 共享内存的删除操作并非直接删除,而是拒绝后续映射,只有在当前映射链接数为0时,...创建 shmid - shmget 函数 #include #include int shmget(key_t key, size_t size,...IPC_CREAT:如果共享内存段不存在,则创建它;如果存在,则返回其标识符 IPC_EXCL:单独使用没意义,只有和IPC_CREAT组合才有意义 IPC_CREAT | IPC_EXCL:如果共享内存段不存在则创建它...key 保证了操作系统内的唯一性,shmid 只在你的进程内,用来表示资源的唯一性 只有在 shmget() 函数 时候用 key,大部分情况用户访问共享内存,都用的是 shmid 3....使用共享内存时,进程间需同步访问,防止数据竞争和不一致性问题 【*★,°*:.☆( ̄▽ ̄)/$:*.°★* 】那么本篇到此就结束啦,如果我的这篇博客可以给你提供有益的参考和启示,可以三连支持一下 !!

    1K10

    原来\进程间通信/是这么回事......

    【进程间通信】常用方式汇总 在系统中,随着我们的进程越来越多,难免不同进程之间要互相传输一些数据,那么这个时候该怎么办呢?...返回值:返回一个近乎唯一的Message queue id 那么,key是如何由ftok生成的呢? 我们可以指定一个文件,调用ftok ,它会根据这个文件的 inode,生成一个近乎唯一的 key。...大数据传输:如果批量的大数据进行传输,使用邮件的方式,来去发送不及时,并且大小也有限制 实时性:用共享内存,其可以大大节省通信时间 3.1 创建共享内存 我们可以创建一个共享内存,调用 shmget。...int shmget(key_t key, size_t size, int shmflg); key:和 msgget 里面的 key 一样,都是唯一定位一个共享内存的对象 size:共享内存的大小...,表示卸载一片共享内存 shmctl的参数: shm_id:shmget的返回值,为共享内存的唯一ID cmd:取值有:IPC_STAT、IPC_RMID等,见:man shmctl buf:共享内存管理结构体

    81820

    进程通信(三)共享内存

    一、共享内存 共享内存是操作系统直接在物理内存上开辟一段空间作为进程间通信的缓冲区域, 与管道、消息队列等其他进程通信方式相比较,共享内存拥有更高的效率,原因是共享内存的设计是基于物理内存的地址直接进行操作的...三、共享内存API分析 shm:share memory共享内存的简写 1.shmget 函数原型:int shmget(key_t key, size_t size, int shmflg); 函数功能...(2)如果key值已经确定,说明已经有一个共享内存了,是由之前其他进程创建的,此时shmget就是获取 该key对应的共享内存。...返回值: 成功:返回共享内存的唯一标识符。 失败:返回-1。...,那么如何解决进程在共享内存的通信过程中实现数据的同步和互斥,避免数据发生混乱的情况呢,请看下篇博客,信号量的使用。

    1.5K30

    【嵌入式Linux应用开发基础】进程间通信(3):共享内存

    函数原型: int shmget(key_t key, size_t size, int shmflg); 参数说明: key:是一个整数值,用于唯一标识共享内存段。...返回值:成功时返回共享内存段的标识符,失败时返回 -1。 ②shmat 函数 功能:将共享内存段附加到调用进程的地址空间中,使得进程可以访问共享内存。...这些场景通常对数据的实时性和一致性有很高的要求,而共享内存正好满足了这些需求。 六、常见问题 6.1....共享内存访问冲突 问题描述:当多个进程同时访问共享内存区域时,如果没有适当的同步机制,可能会导致数据访问冲突,如数据不一致、数据丢失等问题。...共享内存访问权限问题 问题描述:如果共享内存的访问权限设置不当,可能会导致某些进程无法访问共享内存。 解决方法: 在创建共享内存时,确保设置了正确的权限标志。

    14810
    领券