linux之通信机制
通信是一个比较重要的概念。只要存在多于一个执行单元(并发),就有可能存在通信。
linux上的并发主要分为多进程(任务)和多线程。linux也提供了多个通信机制来支持不同进程或者不同线程之间的信息传递。
通信方式主要包括管道,套接字,消息队列,共享内存,信号量,互斥量,信号(如kill -0检测进程是否正常)等。
管道:
1. CGI技术。deamon进程接收一个请求后,创建子进程执行CGI程序,通过无名管道跟子进程进行通信,父进程负责写fd[0],子进程负责写fd[1]。然后deamon程序通过读取子进程的输出管道再返回给客户端。(通信的限制是进程之间必须是有血缘关系)
2. shell管道 如ps -ef |grep xxx
套接字: 可以理解为最常见的CS模型。多Client跟一个Server之间的通信(比如nginx使用fcgi来执行php程序,fcgi跟nginx之间就是通过套接字通信,nginx往9000端口发送请求)。
消息队列: 多进程可以同时读写消息队列,常结合互斥量来实现多线程同步
共享内存: 最快的通信方式,常常结合信号量(信号量的pv操作由系统内核保证原子性)来实现多进程同步
在通信中,比较特殊的是父子进程的通信,因为子进程会从父进程继承很多东西,所以除了以上提到的通信手段外,还可以通过环境变量进行通信。