IPC 方法分类

IPC 方法分类

进程间通信

shell out

  • 被调用程序在执行完毕之前接管用户的键盘和显示,退出后,调用程序重新控制键盘和显示并继续运行。

  • 专门程序通常有文件系统与父进程进行通信,方法是在指定位置读取或修改文件;

    编辑器或邮件器的shellout就是这样工作的。

管道、重定向和过滤器

管道

  • 单向
  • 通常有两个I/O数据流可用:标准输入和标准输出。

Unix shell 支持重定向操作

ls > foo

ls命令的输出写入到foo文件内。

wc < foo

foo内容作为wc文件的输入。


ps | more

ps输出将被分页,根据显示器尺寸显示。

包装器

包装器常常源于需要制定参数来修改被调用程序的行为。

Bernstein 链

和管道类似,不过每个继发阶段的程序取代了前一阶段的程序,并不是与之并行。

  • 类似于流程图,层层传递的流程。
  • 不能重回上一个流程。

从进程

主从进程通过内部处理状态处理他们之间的协议以避免发生死锁和竞争。

  • 比 shellout 更复杂更难以调试

  • 交互的条件:

    • 两者之间涉及的协议完全无足轻重;
    • 从进程是为应用协议进行通讯而设计的。
    • 允许主进程支持命令行开关或者环境变量的方式来允许调用则设置自己的从进程命令;
    • 一定程度上对从进程进行监控;

    以上这些都将有利于调试,便利于开发。

对等进程间通信

临时文件

缺点:

  • 临时文件被删除前,进程被中断,文件将成为遗留垃圾数据;
  • 如果程序中的多个实例使用同一文件名称作为临时文件名,将导致冲突。
  • 安全性:如果攻击程序知道临时文件要写入的位置,可以覆盖整个文件,可能读取生产者的进程数据,或者通过文件中插入修改,造假数据欺骗消费者进程。

优点:

  • 容易创建
  • 不容易产生死锁和竞争

信号

  • 一个进程向另一个进程发送信号(Unix 的信号是一种软中断形式,每个信号都对接受进程产生默认作用【通常是杀掉这个进程】)

套接字

通过套接字通信的两个程序通常都存在双向字节流。

  • 字节流既是按序的,又是可靠的。
  • 套接字描述符一旦获得,行为基本上和文件描述符一样。

要优雅地使用套接字,在 Unix 传统中,首先得设计这些套接字之间使用的应用协议–即一套请求和相应,能够简洁地表达程序通讯的语义。

实例:PostgreSQL(DB) Freeciv

共享内存

要求生产者和消费者程序必须在同一硬件上。

使用共享内存和信号量功能可避免通过网络栈复制数据的开销。