当前位置: 首页 > news >正文

【linux】进程间的通信(一)

1. 了解进程通信

两个或者多个进程实现数据层面的交互

因为进程独立性的存在,导致进程通信成本较高(通信需要成本)

2. 进程间通信目的

  1. 进程间通信的本质是,让不同的进程看到同一份"资源"(即同一份内存空间)
  2. 这个"资源"一般是由操作系统提供的,不是某一个进程独有的,就不会破坏进程的独立性
  3. 进程访问这个资源,进行通信,本质是访问操作系统,进程代表的是用户,"资源"从创建,使用,到释放 ------- 都是调用了系统调用接口

3. 进程间通信发展

 

  • 管道(属于文件级别的通信方式)
  • System V进程间通信
  • POSIX进程间通信

注意:

一般操作系统,会有一个独立的通信模块,隶属于文件系统,IPC通信模块会制定标准,所以进程间通信是有标准的

4. 进程间通信分类

(一)管道

  • 匿名管道pipe
  • 命名管道

(二)System V IPC

  • System V 消息队列
  • System V 共享内存
  • System V 信号量

(三)POSIX IPC

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

5. 管道

(一)认识管道

管道是Unix中最古老的进程间通信的形式

我们把从一个进程连接到另一个进程的一个数据流称为一个“管道"

(二)匿名管道

画图解释

注意:

  1. 匿名管道本质上也是一个文件,只是缓冲区的数据不会刷新到磁盘里面
  2. 弄成读写端,是为了保证管道单向通信

(三)实例代码

pipe函数

功能:创建一无名管道

头文件

#include <unistd.h>

原型

int pipe(int fd[2])

参数

fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端

返回值:成功返回0,失败返回错误代码

 

注意:

匿名管道适用于的两个进程必须是有血缘关系,比如父子关系,兄弟关系,爷孙关系等等

(四)用fork来共享管道原理

由于子进程的进程PCB都是拷贝父进程的,所以子进程创建时(如果父进程一开始使用pipe函数,创建了匿名管道,并且只打开了读端),子进程本应该只能拿到写端(保证进程单向通信),但是由于继承了父进程的写端,容易导致不能达成单向,所以记得关闭多余的读写端

(五)管道读写规则

  1. 读写端正常,管道如果为空,读端会阻塞
  2. 读写端正常,管道被写满,写端会阻塞
  3. 读端正常读,写端关闭,读端会读到0,表明读到管道末尾,不会被阻塞
  4. 读端关闭,写端正常,操作系统就要杀掉正在写入的读端(通过信号杀死)

注意:

管道是有固定大小的,不同内核里,大小有所差别

(六)管道特点

1. 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信:通常,一个管道由一个进程创

建,然后该进程调用fork,此后父、子进程之间就可应用该管道

2. 管道提供流式服务

一般而言,进程退出,管道释放,所以管道的生命周期随进程

一般而言,内核会对管道操作进行同步与互斥

3. 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道


http://www.mrgr.cn/news/45810.html

相关文章:

  • Rust语言发展历程
  • JavaScript 变量的简单学习
  • 力扣206.反转链表
  • 栈_1(2024年10月08日)
  • idea2024版本maven依赖刷新规则
  • JUC-synchronized 知多少
  • 【重学 MySQL】六十一、数据完整性与约束的分类
  • 世界职业院校技能大赛(大数据技术与应用)参赛项目介绍内容模拟示例参考
  • C语言— exec系列函数
  • java泛型
  • 【java数据结构】ArrayList实例
  • webpack学习
  • java8 双冒号(::)使用方法
  • 【C++ 11】for 基于范围的循环
  • 以后再也不要说程序员不能拿诺贝尔了
  • CentOS7 虚拟机操作系统安装及相关配置教程
  • 算法:238.除自身以外数组的乘积
  • 简易CPU设计入门:取指令(四)
  • 1打家劫舍三部曲
  • Java中Collections类详解