コマンドAとコマンドBをパイプでつなげたとき:
$ A | B
Aの処理が速くBの処理が遅いときにパイプが破裂しやしないかと心配したけど、そんなことはなかった。
基本的に、Aの中のprintf()やwrite()はBがread()するまで待たされる。(というか、Aをそういう風に作る)
一応パイプにはバッファがあり、Aは4KBまではwrite()などで先行出力できる。(ulimitコマンドで確認可能変更不可)
さらに、Aがprintf()なんかを使ってるときは もう4KBバッファされる。
※printf()などファイルポインタを使うのは標準ライブラリ内でバッファもされる。これはsetlinebuf()等で抑止できる。
また 標準ライブラリのバッファはまとめて書き込むためのバッファなので、フラッシュされるかバッファがいっぱいになるまで出力されず、そっちの方が問題になることが多い。