awkにはpipeでつないで外部コマンドをフィルタとしてつかう機能がある。
awkプロセスとフィルタプロセスの両方が標準出力に書くようなときにはfflushを適切に呼ばないとだめだよなぁとおもって調べてみたら、いくつか自動でfflush(3C)を呼んでくれるようだ。
FreeBSDの/usr/src/contrib/one-true-awkをみてみる。fflush()してるのは以下のところ:
- FATAL/WARNING: エラーメッセージを出す前にfflush(3C)。
- getline: 読む前にfflush(stdout)。コメントには /* in case someone is waiting for a prompt */ とあるのでプロンプトを出してユーザからの入力待ちのときにflushしたいという意図か。
- printf: パイプで外部プロセスに渡している場合はprintfするたびにfflush(fp)するようだ。
- system: system(3C)の前にfflush(stdout)
- fflush: fflush()かfflush("")なら全fpをfflush(3C)して、openしているfileが指定されたらそれだけをfflush(3C)
- print: リダイレクトしている場合にfflush(3C)する。
- openfile(): openfileはawkの中でファイルやプロセスに関連づけられたfpをとってくるのにつかわれる関数で、fopen(3C)やpopen(3C)する直前にfflush(3C)している。
GNU AWKにinfoにもfflushについて書いてあって
- http://www.gnu.org/software/gawk/manual/gawk.html#I_002fO-Functions
- fflushはPOSIXにはない
- system("")で同じ効果を期待できる
らしい。