即使生产者退出,如何让消费者保持活力

即使生产者退出,如何让消费者保持活力

假设我们有一个简单的管道:

a | b

比如说,a退出 - 有没有一种可靠的方法可以b在任意时间内保持活动状态(以完成任务等)。

答案1

b不会因终止而a终止。

$ { echo hello; } | { read message; printf 'got "%s"\n' "$message"; sleep 5; echo "ok, I'm done"; }
got "hello"
ok, I'm done

在这里,aecho hello)将简单地输出一个字符串并终止。管道 ( ) 的右侧b将读取字符串,输出它,休眠一段时间,然后echo在终止之前执行最后的操作。

如果b在终止时终止a,它将永远没有时间做它需要做的事情。唯一的事情b 不能这里要做的是从标准输入中读取更多数据(read最后的额外数据将立即获得文件结尾)。


在里面其他场景(问题中未提及),如果它尝试写入其标准输出(跨到不存在的进程)并从中终止(默认情况下),则b终止之前将收到一个信号。aaPIPEb

如果它没有尝试写入管道,a将继续运行直到完成。

相关内容