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

进程间的通信1

目录

简介进程间的通信

匿名管道

匿名管道的运作

几个问题


今天我们来学习进程间的通信

简介进程间的通信

进程间通信从最先的管道到System V进程间通信,到最后的POSIX进程间通信。

我们先来学习一下管道。

管道是Unix中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。

这个就相当于一个运输的载体,匿名管道(Unnamed Pipe):用于具有父子关系的进程间通信,单向传输数据,常用于 shell 的管道 | 操作符。匿名管道属于一种进程间的通信,我们称进程间的通信为(IPC)

IPC(Inter-Process Communication,进程间通信)是指多个进程之间交换数据或同步操作的机制。在现代操作系统中,进程是相互独立的,但它们有时需要协同工作,因此需要通过 IPC 来进行数据共享或同步。

匿名管道

匿名管道主要进行的是父子进程之间的通信,然后我们都只读,父进程创建task_struct后,里面有一个指向文件的文件描述符结构体,然后子进程会直接拷贝父进程的部分,那由于是拷贝的,所以由文件描述符表发出的制作就指向同一个文件的内核缓冲区,但是在此之前会先访问struct file,这个文件属性结构体,有pos指向访问文件的位置,flag访问的方法,所以今天子进程和父进程如果要访问的文件是不一样的方式,则在两个进程里面的struct file的flag肯定是不一样的,所以这个文件属性结构体肯定是一人一份的,那这里面还有inode呀,文件最后会被操作系统写入磁盘,inode也同步写入给文件,那在写入磁盘这部分不是进程间的通信所研究的部分,这个部分是存文件的,和进程没有关系,也可以认为OS是大家的,所以没有关系,那struct file是拷贝独一份的,之前那些结果都是拷贝的,所以父子进程最终汇聚到文件内核缓冲区,在这里运行父子进程共同操作,这个纯内存级别的区域就是管道!!!,父子进程共同访问一块空间才有通信的可能,所以IPC的本质是先让不同的进程看到同一份资源。

匿名管道的运作

当父子进程同时来到管道进行通信时,由于肯定一方进行读取,一方进行写入,这样读取的一方才有可能读取完整写入的内容,不然两边都在写入或者读取会乱的,这个我们之前已经有感受过了,如果两个进程同时向显示器写入时,父子进程写入的顺序肯定会交错的。所以管道只能进行单向的通信。

父子进程同时来到管道两边进行通信,此时假设是父进程负责写入,子进程负责读取,管道的两端左边负责读取称为读端,右边就是写端,那父进程先创建管道,然后创建出子进程,为什么是先创建出管道再是子进程呢,因为子进程的fd是拷贝的父进程呀,先创建管道是为了能让子进程等下拷贝的时候负责读写的fd能和父进程指向同一个管道的两端。当子进程被创建的时候读写的指针都指向了管道的相应位置,接着由于父进程只负责写入,所以需要关闭父进程的读端fd[0]的指向,关闭子进程的写端指向fd[1],然后接着就父进程写入管道,子进程读取,然后等到父子进程都处理完了,这次通信就算完了,通信结束后,父子进程都应该关闭管道,释放资源。

几个问题

如果进行通信之前不关闭多余的端口会造成fd泄漏和进程的误操作,由于一开始设计时只需要单向通信,所以匿名管道这种技术就诞生了,这种管道不需要路径,不需要名字,只做单向的是为了需求。这种空间是共享的,不想new出来的那种在堆区的用户空间。

这种像文件一样的东西命名为管道了。

相关文章:

  • Jetson Orin 安装 onnxruntime
  • Web3中的AI:一种去中心化智能的完整指南
  • 奥运会运动员年龄规定·棒球1号位
  • 【C++】5.6 try语句和异常处理
  • C# 命名空间(Namespace)详解
  • 稀疏注意力:打破Transformer计算瓶颈,实现高效长序列建模
  • ES02 - ES语句
  • TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试
  • C/C++ 实现由用户通过键盘输入自然数并判断其是不是素数(带清空缓冲区等考虑)
  • 【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型
  • 全星FMEA软件:汽车电子行业研发管理高效之选
  • VPS加装前置代理全解析
  • uni_app实现下拉刷新
  • K8S学习之基础十七:k8s的蓝绿部署
  • AUTOSAR ETH模块(3)——接口功能分析
  • 利用EasyCVR平台打造化工园区视频+AI智能化监控管理系统
  • 解密 Atlassian Cloud:创新驱动的项目管理之道
  • STM32之I2C通信概览
  • 什么是 spring 的循环依赖?
  • 深入解析EfficientNet:高效深度学习网络与ResNet的对比(使用TensorFlow进行代码复现,并使用cifar10数据集进行实战)
  • 网站发布与推广计划/今日腾讯新闻最新消息
  • 网站模板 pc 移动版/公司推广策划方案
  • 上海网站建设招聘/最新网络营销方式有哪些
  • 网站与网站自动跳转代码/百度建站
  • 网站建设最贵多少钱/重庆seo外包平台
  • 做seo必须有自己网站吗/百度提问在线回答问题