Linux进程间通信IPC

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据同步 1个月
简介: Linux进程间通信IPC

简介


进程之间具有独立性,无法直接通信,因为每个进程都有一个自己独立的虚拟地址空间。


因此让进程间能够通信,本质上就是给进程间提供一块公共的区域,让需要通信的进程都能够访问这块区域,从而就能实现通信。


根据通信应用场景不同,提供的方式也有多种,如:数据传输、数据共享、协调控制


进程间常见的4种通信方式:


       数据传输:管道、消息队列


       数据共享:共享内存


       进程控制:信号量


· 四种进程间通信方式★


一、管道


1.相关特性


使用场景:数据传输


★特性:半双工通信(可以选择方向的单向通信)


       若管道中没有数据,read默认会阻塞等待,直到读取到数据后返回;


       若管道中数据写满,write默认会阻塞,直到数据被读出有空闲空间。


       管道的读写是一种字节流传输服务,数据会在缓冲区堆积,并且遵循先进先出规则。


       若管道所有写端被关闭,read读取完缓冲区数据后,继续读取read将不再阻塞,而是返回0


(所有管道read返回0,表示的是继续读取没有意义)。


       若管道所有读端被关闭,write继续写入数据,则会触发异常,退出程序。


★本质:内核中的一块缓冲区(内核空间的一块内存)


分类:


       匿名管道:内核中的缓冲区没有标识符


       命名管道:内核中的缓冲区具有标识符


2.匿名管道


       因为没有标识符,所以只能用于具有亲缘关系的进程间通信。


       只有通过子进程复制父进程的方式获取操作句柄。


(父进程创建管道后,在创建子进程时,子进程会复制父进程pcb中的大部分信息,其中也包括父进程的管道操作句柄,这样父子进程中的管道操作句柄访问的就是同一个内核缓冲区,从而实现进程间通信)


image.png


3.命名管道


       命名管道的标识符是一个可见于文件系统的特殊管道文件,多个进程通过打开同一个管道文件,访问内核中的同一块缓冲区。


image.png


注意:管道文件只是为了让多个进程找到内核中的同一块缓冲区。


4.管道操作★


4.1匿名管道


int pipe(int pipefd[2]);


功能:创建一个匿名管道


       pipefd[0]:用于从管道中读取数据;


       pipefd[1]:用于向管道中写入数据。


返回值:


       成功:返回0;


       失败:返回-1。


4.2命名管道


int mkfifo(const char* pathname, mode_t mode);


功能:创建一个命名管道的标识符(命名管道文件)


       pathname:带有路径文件名称


       mode:文件权限


返回值:


       成功,返回0;


       失败,返回-1;


       EEXIST,文件已存在。


注意:mkfifo只是创建了一个管道的标识符,后续对于命名管道的操作类似于对普通文件操作。


打开特性:


       如果管道文件被只读打开,就会阻塞,直到管道文件被以写方式也打开;


       如果管道文件被只写打开,也会阻塞,直到管道文件被以读方式也打开。


5.管道总结★


       管道的本质就是内核中的一块缓冲区,分为匿名管道和命名管道。其中匿名管道只能用于具有亲缘关系的进程间通信。


特性:


1)半双工通信;


2) 提供字节流传输服务:


       先进先出;


        基于连接:所有读端关闭write异常,所有写端关闭read返回0不阻塞


3)生命周期跟随进程


4)自带同步与互斥:


       互斥:资源在同一时间只有一个进程可以访问


                管道的写入操作大小不超过PIPE_BUF(默认4096字节)大小时保证原子操作


               (原子操作:要么一次性完成,无法被打断;要么不做。)


       同步:通过某些条件限制,让进程对资源访问更加合理


               若管道中没有数据,则read阻塞;


               若管道中数据已满,则write阻塞。


二、共享内存


1.相关特性


使用场景:实现进程间的数据共享


★特性:最快的进程间通信方式


原理:


       申请一块物理内存,需要进行数据共享的进程将同一块物理内存映射到自己的虚拟地址空间,然后通过虚拟地址直接访问。相较于其他通信方式,没有了两次用户空间与内核空间之间的数据拷贝操作,因此速度最快。


2.操作流程


       1)创建/打开共享内存


       2)将共享内存映射到虚拟地址空间


       3)共享内存操作


       4)解除映射关系


       5)删除共享内存


3.操作接口


3.1创建或打开操作


int shmget (key_t key, size_t size, int shmflag);
        key:标识符,多个进程通过标识符打开同一个共享内存;
        size:共享内存大小;
        shmflag:打开方式&权限;
                打开方式:IPC_CREAT,......;
                权限:0777,......;


返回值:


       成功,返回操作句柄(非负整数);


       失败,返回-1。


3.2建立映射关系操作


void *shmat(int shmid, void *addr, int shmflag);
        shmid:shmget返回的操作句柄;
        addr:指定映射首地址(通常置NULL);
        shmflag:要进行的操作
                SHM_RDONLY:只读;
                默认给0:可读可写;


返回值:


       成功,返回映射的首地址;


       失败,返回(void*)-1。


3.3解除映射关系操作


int shmdt(void *shm_start);
        shm_start:shmat映射的首地址。


3.4删除共享内存操作


int shmct(int shmid, int cmd,  struct shmid_ds *buf);
        shmid:shmget返回的句柄;
        cmd:要对共享内存的操作
                删除:IPC_RMID
                ......;
        buf:用于设置或获取共享内存信息,不使用则设置为NULL。


返回值:对于删除操作


       成功:返回0;


       失败:返回-1。


★注意:


共享内存的删除,实际上并不会立即删除共享内存,而是将共享内存标记为被删除状态,拒绝后续的新建映射,等到映射连接数为0时,自动释放共享内存段。


4.共享内存总结


4.1本质原理


       共享内存的本质就是开辟了一块物理内存,将其映射到多个进程的虚拟地址空间中,进程通过映射后的虚拟地址直接访问同一块物理内存,实现数据共享。


4.2特性


       最快的进程间通信方式(相较于其他方式,少了用户空间与内核空间之间的两步数据拷贝操作)。


       生命周期随内核。


4.3注意事项


多个进程对共享内存进行操作,存在操作安全隐患。


三、消息队列


使用场景:用于实现进程间的数据传输


本质:内核中的一个优先级队列


原理:多个进程通过访问同一个内核中的消息队列,向队列中添加节点、获取节点,实现数据传输


特性:


       消息队列自带同步与互斥;


       生命周期随内核。


四、信号量


使用场景:用于实现进程间的同步与互斥


本质:内核中的一个计数器和pcb等待队列


原理:针对资源进行计数,实现同步与互斥


操作:PV操作


       P操作:在获取或者访问资源前进行P操作


               对计数器进行判断,若小于等于0,则阻塞进程并且计数器-1;


               若计数器大于0,则计数器-1,操作正确返回。


       V操作:在产生资源之后进行V操作


               计数器加1,并唤醒一个等待中的进程。


同步实现:


       对资源进行计数,在资源获取之前进行P操作,在产生资源后进行V操作。


互斥实现:


       将资源计数器初始化为1,表示资源只有一个。


       在访问数据前进行P操作,访问数据完毕之后进行V操作,从而实现同一个资源同一时间内,只有一个进程能够进行访问。


五、进程间通信资源的命令操作


1. ipcs 查看进程间通信资源


语法:ipcs [选项]


-m:共享内存


-s:信号量


-q:消息队列


2. ipcrm 删除进程间通信资源


语法:ipcrm [选项] 资源id


1.png

 


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
6天前
|
Linux Shell
6-9|linux查询现在运行的进程
6-9|linux查询现在运行的进程
|
21天前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
38 10
|
14天前
|
消息中间件 Python
深入理解操作系统的进程间通信(IPC)机制
本文将探讨操作系统中的核心概念——进程间通信(IPC),揭示其在系统运作中的重要性及实现方式。通过分析不同类型的IPC手段,如管道、信号、共享内存等,帮助读者更好地理解操作系统的内部工作原理及其在实际应用中的表现。
23 1
|
20天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
14 3
|
22天前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
44 5
|
22天前
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【9月更文挑战第11天】在软件开发中,随着应用复杂度的提升,进程间通信(IPC)成为构建高效系统的关键。本文通过一个分布式日志处理系统的案例,介绍如何使用Python和套接字实现可靠的IPC。案例涉及定义通信协议、实现日志发送与接收,并提供示例代码。通过本教程,你将学会构建高效的IPC桥梁,并了解如何根据需求选择合适的IPC机制,确保系统的稳定性和安全性。
36 5
|
19天前
|
消息中间件 Unix
操作系统的心脏:深入理解进程间通信(IPC)
在现代计算中,操作系统扮演着至关重要的角色,它不仅管理着硬件资源,还负责协调和优化应用程序之间的交互。本文将深入探讨操作系统中的一个核心概念——进程间通信(IPC),揭示其背后的机制以及在实际应用中的重要性。通过通俗易懂的语言和条理清晰的解释,本文旨在为读者提供一个关于IPC的全面了解,从基本定义到高级应用,带领大家走进操作系统的神秘世界。
|
24天前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【9月更文挑战第9天】你是否曾遇到多个Python程序像孤岛般无法通信,导致数据孤立、任务难协同的问题?掌握进程间通信(IPC)技术,可助你打破这一僵局。IPC是不同进程间传递数据或信号的机制,在Python中常用的方法有管道、消息队列、共享内存及套接字等。其中,管道适用于父子或兄弟进程间简单数据传递;套接字则不仅限于本地,还能在网络间实现复杂的数据交换。通过学习IPC,你将能设计更健壮灵活的系统架构,成为真正的编程高手。
20 3
|
25天前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
22 4
|
25天前
|
消息中间件 数据库 Python
深度剖析!Python IPC的奥秘,带你走进进程间通信的微观世界
【9月更文挑战第8天】在编程世界中,进程间通信(IPC)是连接不同程序或进程的关键技术,使数据在独立进程间自由流动,构建复杂软件系统。本文将深入探讨Python中的IPC机制,包括管道、消息队列、套接字等,并通过具体示例展示如何使用Socket实现网络IPC。Python的`multiprocessing`模块还提供了队列、管道和共享内存等多种高效IPC方式。通过本文,你将全面了解Python IPC的核心概念与应用技巧,助力开发高效协同的软件系统。
39 2
下一篇
无影云桌面