进程间互相交换信息的工作称作进程通信。有以下6种常见的进程通信方式:
管道/匿名管道(Pies)
管道具有以下限制:
- 只支持半双工通信
- 只能在父子进程中使用
图中fd[0]用于读,fd[1]用于写。
有名管道(Names Pipes)
- 有名管道采用先进先出FIFO(First in First out)通信机制,去除了管道只能在父子进程中使用的限制。
- 有名管道常用于客户-服务器应用程序中,用作汇聚点,在客户进程和服务器进程之间传递数据。
消息队列(Message Queuing)
- 消息队列是消息的链表,存放在内存中并由消息队列标识符标识;
- 管道和消息队列的通信都是FIFO原则,与管道(匿名管道:只存在于内存中的文件;有名管道:存在于实际磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正地删除;
- 消息队列可以实现消息的随机查询,消息不一定要以FIFO的次序读取,也可以按消息的类型读取;
- 消息队列克服了信号承载量少、管道只能承载无格式字节以及缓冲区大小受限制等缺陷。
信号量(Semaphores)
信号量是一个计数器,用于多进程对共享数据的访问,其意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争。
共享内存(Shared Memory)
是的多个进程可以访问同一块内存空间,不同进程可以及时看到其它进程对共享内存中数据的更新。这种方式依靠某种同步操作,如互斥锁和信号量等。
套接字(Sockets)
主要用于客户端和服务器之间通过网络进行通信。套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点。