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

UNIX IPC方法的分类

和单进程程序一样,简单的就是最好的。在使用更复杂、更晚出现的技法前,应该通过实证所有出现更早的,更简单的技法都不管用了

1、管道、重定向和过滤器
管道是对"做单件事情并做好“的哲学理念的践行
约定:每个程序一开始(至少)有两个I/O数据流可用:从标准输入和标准输出(文件描述符数字分别为0和1)。许多程序都可以写作过滤器,从标准输入顺序读取数据,并且只向标准输出写数据。

通常,这些数据流分别和用户键盘和显示器连接。但是unix shell普遍支持重定向操作,可以把这些标准输入输出流连接到文件。举例如下:

管道把一个程序的标准输出连接 到另一个程序的标准输入。用这种方式连接起来的一系列程序称为管线。

ls  > foo 
 
把目录命令ls的输出写入到名为”foo“的文件中
wc  > foo       将令数字统计程序wc以文件”foo“为输入,然后把字符数、字数、行数、发送到标准输出
ls  |  wc        可以看到当前目录列表的行数


管道线中所有阶段的程序都是并发运行的,注意到这一点很重要。每一段等待前一段的输出作为输入,但在下一段能够运行前没有哪个段必须退出。这个特性在分析管道的交互作用时候非常重要。管道和重定向的组合能力非常强大。

管道的缺点:单向性,管道线的成员除了终止外,不可能回传控制信息管道是半双工通信

  • 为分页程序建立管道    ps | more  把ps的输出管道连接至more的输入,每次按键后可以继续显示一整屏的进程列表,more不能向前滚屏,现代unix中已经用ps | less 取代了more来获得更好的 分页程序体验

2、对等进程间的通信

实际上通信和网络中,我们常常用需要对等通道,需要数据能够自由双向的流动。

(1)临时文件:把临时文件作为协作程序之间的通信中转站使用,是最古老的IPC通信方法。

优点  缺点
创建灵活简单,不容易产生死锁和竞争若进程在临时文件可被删除前中断,会遗留垃圾数据;多个实例使用用一个名字作为临时文件会产生冲突,规避方式是shell脚本中对临时文件名称包含$$,用载入shell的进程ID来保证文件名的唯一性
有时候其他方式派不上用场,只能使用该方式若攻击程序知道临时文件要写入的位置,可覆盖掉那个文件,可以读取数据或者修改、假造数据。如果涉及的进程有root权限,风险更大

3、信号

同一个机器上的两个进程相互通信,最简单原始的方法是一个进程向另一个进程发送信号。

4、套接字

封装网络数据的方法。通过套接字通信的2个程序通常都存在双向字节流。字节流既是按序,又是可靠的。

性能压力可能促使使用共享内存、临时文件或者其他要求更多局部性条件的技法,但是现代最好设想代码需要增加分布式操作。套接字是双向IPC的正确方法。优雅的使用套接字首先需要设计套接字之间时用的应用协议——即一套请求和响应能够简洁的表达程序通讯的语义。如TCP/IP风格的套接字,已经成为主流的unix IPC方法

使用套接字通信的2个进程可能在不同的机器上(甚至可能跨越半个帝地球,通过互联网连接起来)。

5、共享内存

共享内存要求生产者和消费者必须在同一硬件上。如果通信进程能够访问同一个物理内存,那么共享内存则是最快的信息传递方法。

由于共享内存无法通过类似读写调用的规范自动序列化,因此处理共享内存的程序必须要自己处理竞争和死锁问题。典型方法是在共享段中使用信号量变量。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 进程+线程+协程
  • Rust的常数、作用域与所有权
  • 如何将图表数据拟合为函数
  • EmguCV学习笔记 C# 9.3 移动检测类
  • flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位
  • 轻松上手,高效产出:音频剪辑工具年度精选
  • Ubuntu 24.04上卸载LibreOffice
  • 怎样在日常生活中避免泄露个人信息
  • pycharm如何安装selenium
  • Linux 开机自动启动服务
  • android kotlin 数据类 data class
  • python学习8:dict字典的定义,操作和方法,跟json有什么区别?
  • C++:priority_queue(优先级队列)的模拟实现
  • QML入门之基本元素
  • 嵌入式软件--51单片机 DAY 2
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Laravel核心解读--Facades
  • pdf文件如何在线转换为jpg图片
  • spring boot 整合mybatis 无法输出sql的问题
  • webpack入门学习手记(二)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 基于游标的分页接口实现
  • 开发基于以太坊智能合约的DApp
  • 蓝海存储开关机注意事项总结
  • 思考 CSS 架构
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • zabbix3.2监控linux磁盘IO
  • 阿里云ACE认证之理解CDN技术
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #VERDI# 关于如何查看FSM状态机的方法
  • #宝哥教你#查看jquery绑定的事件函数
  • $ git push -u origin master 推送到远程库出错
  • ()、[]、{}、(())、[[]]命令替换
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (四)图像的%2线性拉伸
  • (转)Unity3DUnity3D在android下调试
  • (转)关于pipe()的详细解析
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net经典笔试题
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET正则基础之——正则委托
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • ??myeclipse+tomcat