进程间通讯(IPC InterProcess Communication)的方式

  • 管道 管道分为匿名管道和命名管道. 匿名管道是半双工通信, 即单向通信, 只用于父子进程或兄弟进程之间, 只存在于内存中. 命名管道, 又称为FIFO, 如其名字是一种有名字的管道, 其可以实现无关进程之间的信息交换, 其有文件系统标识, 即有相关的路径名与其对应, 以一种特殊的设备文件形式存在与文件系统中. 其在传输过程中按照FIFO原则, 类似使用文件传输数据.

  • 消息队列 消息队列, 是消息的链接表, 放在内核中, 一个消息队列由一个标识符来标识. 消息队列面向记录, 消息具有特定的格式和特定的优先级, 可以解决管道消息没有格式的问题, 但是读取需要从内核拷贝, 速度不及时. 消息队列独立于发送和接受进程, 进程终止时, 消息队列机器内容不会被删除. 同时可实现随机查询, 或按照优先级查询, 消息不需要先进先出.

  • 信号量 信号量是一个计数器, 其用于实现进程间的同步和互斥, 而不是用作存储. 如果真的需要传递数据, 则需要共享内存等手段结合起来使用. 其通过P/V原子操作来控制, 保护资源的同步和访问, 来实现进程间信息传递.

  • 共享内存 两个或多个进程共享同一块内存空间. 是最快的一种IPC, 因为直接对内存进行读取, 但是需要进行同步, 因为多个进程可以同时访问. 常和信号量一起使用, 保证同步.

  • Socket 网络通信方式, 可以跨主机, 也可以本地通信. 分为TCP, UDP和本地进程间通信三种方式.