Linux进程间通信: FIFO(2)

1. 用FIFO复制输出流

    管道只能用于进程间的线性连接, 而FIFO具有名字, 所以它可用于非线形连接.

    使用FIFO以及UNIX系统程序tee, 就可以实现无需使用临时文件的过程. (tee程序将其标准输入同时复制到其标准输出以及其命令行中包含的命名文件中.)

mkfifo fifo1
prog3 
<  fifo  &
prog1 
<  infile  |  tee fifo1  |  prog2

说明一下:

  • 首先, 创建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会遗留在文件系统中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值