ToDo:
なんか #lowhacks で書く時は select から帰ってきた書き込み用 fd に 書くとブロックされちゃうかも >< とかいう話があって、 PIPE_BUF までは大丈夫だと適当に思ってたのだけど なんか勘違い的な。
http://cvs.m17n.org/~akr/diary/d2005_01.html#a2005_01_27_1
akr先生はダメだとおっしゃられている。 先生の投稿であるところの
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/26552
とか
http://cr.yp.to/docs/unixport.html
を見ると、 まぁ PIPE_BUF までくらいなら 最近のシステムなら大丈夫だったりするのかなぁ… とか思わんでもないけど、 移植性とか考えるとやめとけって感じのようだ。
このへんもおもしろいな。
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2007-06/msg00150.html
うーむ基本的なことがわかってないなぁ。 linux 限定ならどうなんだろうな
(01:21)
http://itpro.nikkeibp.co.jp/article/COLUMN/20081006/316216/
ユーザレベルスレッドでこれができるってのはうーん、 FFI 呼ぶ前にネイティブスレッド作るか signal でなんとかするか、かな?
次のページ読むに thread pool 的なのがあるのか。
(01:36)
前 | 2008年 10月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。
よく分かっていないのですが、
pipe用リングバッファが4kだったとして、PIPE_BUFも4096だったとして、さて、現在バッファが空であることをどうやって保証しましょうか?
なんて話になったりしませんか?
それは次読むポインタと次書くポインタが一致してればカラ、とかでダメですかね。
えーと、カーネルがもってるパイプのリングバッファのポインタはユーザランドからは分からないかと。
なにかプロトコル的なお約束がない限りはwriterはreaderが前回送った内容をすでに吸い取り済みかどうかは分からなかったりしません?
まさにそこが select のプロトコルという話なのでは。
selectでパイプが空になったら起床させるなんて出来ないような・・・
たしかに保証されてはいないですね
ユーザ空間で頑張るということではなく、 linux の select が実際どういう動きしてるのかな、というのが興味です。ちょっと実験した感じでは、 linux のパイプに関しては 4096B 以上出力できる時にだけ select がかえっているように見えます。
write(2) の pipe に対する atomic 保証の文面は、自然に考えると select が pipe に関しては 4096B 以上出力できる時にかえる、という動作も暗に示してると考えてもいいかなー的にも思ってしまいますが、まぁ「select については何も言ってない」というのが正しいですねそうですね…
ちゃんと新しいカーネルで調べたところ、pipeバッファが16ページに拡大されるときに、1ページまるっとあいてないと起きない実装に変わっているようです。
ほんますいませんm(_ _)m
実装の話としては、
パイプが 4K な Linux 2.4 で、
1byte でも中に入ってると select で writable にならないという挙動が見られました。
2.4.31のソースみたら、こんな素敵なコードが・・
つまり、emptyだったらwritebleで、そうじゃなかったらreadableという排他的な関係。
pipe_poll(struct file *filp, poll_table *wait)
{
(snip)
mask = POLLIN | POLLRDNORM;
if (PIPE_EMPTY(*inode))
mask = POLLOUT | POLLWRNORM;