1. 用FIFO复制输出流
管道只能用于进程间的线性连接, 而FIFO具有名字, 所以它可用于非线形连接.
使用FIFO以及UNIX系统程序tee, 就可以实现无需使用临时文件的过程. (tee程序将其标准输入同时复制到其标准输出以及其命令行中包含的命名文件中.)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
说明一下:
- 首先, 创建FIFO
- 然后, 在后台启动prog3, 它从FIFO读数据.
- 然后, 启动prog1, 用tee将其输出发送到FIFO(prog3)和prog2
2. C/S进程使用FIFO进行通信
如果有一个服务器进程, 它与很多客户进程有关, 则每个客户进程都可将其请求写到一个该服务器进程创建的众所周知的FIFO中. 因为对于该FIFO有多个写进程, 客户进程发送给服务器进程的请求其长度要小于PIPE_BUF字节. 这样就能避免客户多个write之间的交错.
在这种类似的C/S进程通信中使用FIFO的问题是: 服务器进程如何将回答送回各个客户进程?
不能使用单个FIFO, 因为服务器进程会发出对各个客户进程请求的响应, 而请求者却不可能知道什么时候去读才能正好读到对它的响应.
这个问题的解决办法是:
- 每个客户进程都在其请求中包含它的进程ID.
- 然后服务器进程为每个客户进程创建一个FIFO, 所使用的路径名是以客户进程的进程ID为基础的. 如, /tmp/serv1.XXXX, 其中XXXX被替换为客户进程的ID.
- 服务器进程必须捕捉SIGPIPE信号, 因为客户进程在发送一个请求后没有读取响应就可能终止, 于是留下一个只有写进程而无读进程的客户进程专用FIFO.
然而, 这样的安排还有不足之处, 也就是客户进程崩溃后, 服务器为它创建的FIFO会遗留在文件系统中.