出力をバッファリングしないとは?
[上に]
[前に]
[次に]
小次郎
[E-Mail]
2000/05/31(水) 12:48:34
Perlスクリプトの先頭に、よく「出力をバッファリングしないため」
ということで、$|=1; と記述していますが、これは具体的には
一体どのような効果があるのでしょうか? また「バッファリング」
とは何のことなのでしょうか?
よろしくご教授ください。
謎の人
2000/05/31(水) 13:13:23
CGIプロセスでバッファリングすると、デットロック状態になるって本に書いてありました...。
バッファリングとは、付加のかかる出力処理より本来の処理を優先させ、
後から、バッファリングしたデータを出力。ですか..。
B-Cus
2000/05/31(水) 20:56:13
> バッファリングとは、付加のかかる出力処理より本来の処理を優先させ、
> 後から、バッファリングしたデータを出力。ですか..。
# ↑のようなことをバッファリングって言うの?
少なくとも、ここ ($|=1) で言うところのバッファリングは
違います。$|=1 は、stdio のバッファリングを OFF にしている
だけです。なので、
> CGIプロセスでバッファリングすると、デットロック
> 状態になるって本に書いてありました...。
そういうことは起こりません。
できる限り $|=1 としないようにしましょう。マシンに負荷が
かかり、パケットを余計に飛ばしてしまいます。
細かいところまで知りたければ、
- バッファリングとは何か
- stdio のバッファリング (行単位バッファリング、完全
バッファリング、バッファリングなし)
- printf(3) と write(2) の関係 (UNIX なら)
- apache のバッファリング (最近の apache はバッファリングしない)
- TCP のバッファリング
を勉強すればいいですが、解説は他の人にまかせた。
とほほ
2000/06/01(木) 02:14:33
> 後から、バッファリングしたデータを出力。ですか..。
うーん、まぁ、そう言えないこともないような、あるような・・・
バッファリングは、次のようなスクリプトで体感できると思います。
open(OUT, "> file.txt");
# ファイルをオープンする。
print OUT "AAA";
# AAAを書き込んだように見せかけておいて、
# 実は、Perlのメモリ中に溜める(バッファリングする)だけ
open(IN, "file.txt"); print "1:" . <IN>; close(IN);
# だから、file.txtを表示しても何も表示されない。
$old = select(OUT); $| = 1; select($old);
# ってやると、OUTへの書き込みがバッファリングされなくなる
print OUT "BBB";
# 今度はバッファリングせずに、それまで溜まっていたデータ(AAA)も
# まとめて、ファイルに書き出される。
open(IN, "file.txt"); print "2:" . <IN>; close(IN);
# だから、file.txtを表示すると、今度は表示される。
close(OUT);
メモリ中にバッファリングされたデータがフラッシュされる(吐き出される)
タイミングは、close()された時は必ず、あとは、一定量のデータが
溜まった時とか、ファイルロック状態が変わった時とか・・・
> デットロック状態になるって本に書いてありました...。
Aさんが書いたデータを元にBさんがデータを書き、
Bさんが書いたデータを元にAさんが・・・
というプログラムなら、デッドロック状態になるかもしれませんが、
(今、無理矢理そういうケースを考えてみました^^;)
プログラムの組みかた次第ですね。
謎の人
2000/06/01(木) 09:00:17
B-Cusさんへ
認識を新たにします。
これからもご指導よろしくお願いします。
とほほさんへ
私の発言へのフォローありがとうございました。
やさしさを感じました。
小次郎さんへ
的外れな回答をして、ごめんなさい。
これからは、慎重にいきます。
小次郎
2000/06/01(木) 19:15:41
とほほさん、B-Cusさん、謎の人さん
レスをありがとうございました。
意外と難しいことなのですね。
結論としてはやはり、掲示板やカウンタなどのCGIスクリプトの
先頭部には必ず
$|=1;
と記述しておいたほうがいいのでしょうか?
S-pore
[HomePage]
2000/06/01(木) 20:30:52
> レスをありがとうございました。
> 結論としてはやはり、掲示板やカウンタなどのCGIスクリプトの
> 先頭部には必ず
> $|=1;
> と記述しておいたほうがいいのでしょうか?
謎。
B-Cus
2000/06/01(木) 23:11:03
> 先頭部には必ず
> $|=1;
> と記述しておいたほうがいいのでしょうか?
いいえ、違います。必要な場合のみ記述すべきです。
halcyan
2000/06/02(金) 14:11:15
http://cgi.members.interq.or.jp/green/tkiduki/cgi-bin/bbs/plum.cgi?book=support&res=71
他人の掲示板へのリンクになってしまいますけど、
これなんか参考にされてはどうでしょう?
小次郎
2000/06/02(金) 17:24:44
[[解決]]
皆さん、ありがとうございました。
お蔭様でよく理解することができました。
[上に]
[前に]
[次に]