Unix/Linux管道是生产者还是消费者驱动?

假设我有这个:

A | B | C

管道如何工作? A只在B请求时产生数据吗?如果B目前无法接受,A会不断产生数据然后阻止?什么是C的角色?我意识到我正在设计的系统在概念上与这些管道非常相似 – 我想借鉴现有的范例,而不是发明一些只能工作一半的小说.

最佳答案
Unix中的管道有缓冲区,因此即使右侧进程(RSP)不消耗任何数据,左侧进程(LSP)也能够在阻塞之前产生几千字节.

然后,如果缓冲区已满,则最终阻止LSP.当RSP读取数据时,它释放部分或全部缓冲区空间,LSP恢复操作.

如果不是2个进程而是3个,那么情况或多或少相同:更快的生产者被更慢的消费者阻止.显然,如果管道变空,更快的消费者会被生产者放慢阻塞:只需要考虑一个交互式shell,等待所有人中最慢的生产者:用户.

例如,以下命令:

$yes | cat | more

由于屏幕满时更多的块,直到用户按下一个键,cat进程将填充其输出缓冲区并停止,然后yes进程将填充其缓冲区并停止.等待用户继续的一切,应该如此.

PS:一个有趣的事实是:当更多的过程结束时会发生什么?好吧,该管道的右侧是关闭的,因此cat进程将获得一个SIGPIPE信号(如果它再次在管道中写入,它将会)并且将会死亡.是的过程也会发生同样的情况.所有过程都应该死掉.

转载注明原文:Unix/Linux管道是生产者还是消费者驱动? - 代码日志