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

管道的学习

进程间通信:是指在操作系统中,两个或多个独立的进程之间进行数据交换和信息共享的一种机制

进程间通信的本质:先让不同的进程先看到同一份资源,才有通信的条件

进程间通信的目的:

1.将一个进程的数据发送给另一个进程

2.多进程之间共享同样的资源

3.一个进程需要将另一个或一组进程发送消息,通知它(他们)发生了某种事件 eg:进程终止要通知父进程

4.有些进程希望完全控制另一个进程的执行(eg:Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

管道

管道是一种进程间通信的形式

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

匿名管道

创建一个无名管道
#include <unistd.h>

int pipe(int fd[2]);

fd:文件描述符数组

fd[0]:读端

fd[1]:写端

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

fork共享管道

管道的使用和文件一样

管道的五种特性

1.匿名管道,只能用来进行具有血缘关系的进程进行进程间通信,所以常用于父子间

2.管道文件自带同步机制,就会有4种通信情况

3.管道是面向字节流的

4.管道是单向通信的

(属于半双工的一种特殊情况)

    半双工:任何时刻,一个发,一个收

    全双工:可以同时发和收

四种通信情况

1.写慢,读快 --> 读端要等写端,读端进程就会阻塞

2.写快,读慢 --> 满了的时候,写端要等读端,就要阻塞等待

3.写端关闭,读端继续  --> read就会读到返回值为0,本身文件结尾

4.读端关闭,写端继续  --> 写端再写入就没有任何意义,OS不会做没有意义的事情,就会杀掉进程,发送异常信号(  13)SIGPIPE  )

命名管道

创建命名管道

int main(int argc, char *argv[])
{
    mkfifo("p2", 0644);
    return 0;
}

命名管道 VS 匿名管道

他们创建和打开的方式不同

匿名管道右pipe函数创建并打开

命名管道由mkfifo函数创建,打开用open

管道的写入原子性

相关文章:

  • 当一个后端下载了一个VUE开源项目,怎么开始着手玩一下
  • 【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库
  • git 操作 已经 commit 但是没有 push 怎么办
  • 国产编辑器EverEdit - 独门暗器:自动监视剪贴板内容
  • 嵌入式0xDEADBEEF
  • 用python进行二分法查找(python实例三十)
  • 【算法通关村 Day5】Hash和队列的经典问题
  • 敏捷开发06:用户故事估算方法介绍
  • DDD领域驱动开发第2讲:领域驱动开发在货代订单业务的实践
  • 爬虫获取的数据能用于哪些数据分析?
  • 基本控制环节的幅频和相频特性
  • 期权帮|场外个股期权杠杆与风险分析
  • Vue 3 30天精进之旅:Day 29 - 项目实战
  • 拦截器VS过滤器:Spring Boot中请求处理的艺术!
  • 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践
  • 了解几个 HTML 标签属性,实现优化页面加载性能
  • HTML/CSS中后代选择器
  • 目标跟踪(Object Tracking) vs. 目标识别(Object Recognition)
  • 【基础架构篇十五】《DeepSeek权限控制:RBAC+ABAC混合鉴权模型》
  • 第十篇:电源设计的“能量矩阵”——无线充电与碳化硅LLC谐振
  • 纪念|脖子上挂着红领巾的陈逸飞
  • 圆桌丨全球化博弈与人工智能背景下,企业如何落地合规体系
  • 南宁一学校发生伤害案件,警方通报:嫌疑人死亡,2人受伤
  • 特朗普再提“接管”加沙,要将其变为“自由区”
  • 向猫学习禅修之后,你会发现将生活降格为劳作是多么愚蠢
  • 著名词作家陈哲逝世,代表作《让世界充满爱》《同一首歌》等