说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Linux网络编程》、《linux系统编程》、《Unix环境高级编程》
目录:
一、概念
Linux下多进程间的通信机制叫做进程间通讯机制(IPC,Inter-Process Communication),是多个进程间进行相互沟通的一种方式。
每个进程都有自己独立的内存空间,通过IPC实现数据共享。
1️⃣标识符和键:
IPC结构:消息队列,信号量,共享内存
内核中每个IPC结构对象都有内部名(非负整数的标识符)和外部名(数据类型key_t
的键)。
ftok()
函数由路径名和项目ID创建一个键。
2️⃣shell指令:
ipcs
(IPC Show:显示IPC信息)
③Semaphore Arrays(信号量数组)
3️⃣如何查看IPC相关函数?(xxx 为msg、sem、shm)
①man xxxget
:创建
②man xxxop
:操作
③man xxxctl
:控制
二、实现方式
(1)管道(pipe)
【详细点击:进程篇——进程间通信:管道】
本质:操作方式为文件的内存缓冲区。
分类:
项目 | 匿名管道 | 命名管道(FIFO) |
---|---|---|
特点 | 无文件名, 只可用于亲属进程之间的通信 | 有文件名, 可用于不同进程之间通信 |
函数 | ①pipe() [系统调用 - man 2] ②popen()与pclose() | mkfifo() [库函数 - man 3] |
通信方式 | 半双工 | 半双工 |
(2)消息队列(Message Queue)
【详细点击:进程篇——进程间通信:消息队列】
消息队列是内核地址空间中的内部链表,通过Linux内核在各个进程之间传递内容。
消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识。内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是相对独立的。每个消息队列中的消息,又构成一个独立的链表。
(3)信号量数组(Semaphore Arrays)
【详细点击:进程篇——进程间通信:信号量】
信号量是一种计数器,用来控制对多个进程共享的资源所进行的访问,为获取共享资源,进程需执行以下操作:
①测试控制该资源的信号量(原子操作)
②若信号量的值为正,则进程可使用该资源。进程将信号量值减1(原子操作),表示它使用了一个资源单位。
③若信号量的值为0,则进程进入休眠状态,直至信号量值大于0,进程被唤醒,返回①步。
常用信号量形式:二元信号量或双态信号量,用于控制单个资源,初始值为1。
一般而言,信号量的初值可为任一正值,用于说明有多少个共享资源单位可供共享应用。
常常被用做一个锁机制,在某个进程正在对特定资源进行操作时,信号量可以防止另一个进程去访问它。
生产者和消费者的模型是信号量的典型使用。
(4)共享内存(Shared Memory Segments)
【详细点击:进程篇——进程间通信:共享内存】
共享内存是在多个进程之间共享内存区域的进程间的通信方式,它是在多个进程之间对内存段进行映射的方式实现内存共享的。这是IPC最快捷的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则是需要将数据通过中间机制进行转换;与此相反,共享内存方式直接将某段内存段进行映射,多个进程间的共享内存是同一块的物理空间,仅仅是地址不同而已,因此不需要进行复制,可以直接使用此段空间。