プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

pipeのselectって今どうなってるんだっけ? このエントリーをはてなブックマークに追加

http://shinh.skr.jp/m/?date=20081008


よく分かっていないのが、よく分かったので調査。
manみると2.6.11でpipeの実装かわってるみたいだし。

まず、単純に/usr/include以下でPIPE_BUFをgrep

./bits/posix1_lim.h:98:#define _POSIX_PIPE_BUF 512
./bits/posix1_lim.h:143:#define _POSIX_HIWAT _POSIX_PIPE_BUF
./bits/confname.h:38: _PC_PIPE_BUF,
./bits/confname.h:39:#define _PC_PIPE_BUF _PC_PIPE_BUF
./linux/limits.h:15:#define PIPE_BUF 4096 /* # bytes in atomic write to a p\
ipe */



ふむ。manどおり単純に4096になっていそう。


つぎにpipe_pollの実装をみると

static unsigned int
pipe_poll(struct file *filp, poll_table *wait)
{
unsigned int mask;
struct inode *inode = filp->f_path.dentry->d_inode;
struct pipe_inode_info *pipe = inode->i_pipe;
int nrbufs;

(省略)

poll_wait(filp, &pipe->wait, wait);

if (filp->f_mode & FMODE_WRITE) {
mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
/*
* Most Unices do not set POLLERR for FIFOs but on Linux they
* behave exactly like pipes for poll().
*/
if (!pipe->readers)
mask |= POLLERR;
}


PIPE_BUFFERSは16。
nrbugsの意味ってなんじゃい。と思ってみると

pipe_writeでページを書くたびにインクリメントしてるな。だから4096 x 16 で最大長65536が算出されると。
じゃあ、1ページまるっと空いてないと起きないんだから、書き手が1人の場合はPIPE_BUF以下の書き込みがブロッキングしないのは保証されるな。うん。

shinhさん、akrさん、どうもアホな発言でご迷惑をおかけしました(ぺこり)

関連記事


linux | 【2008-10-09(Thu) 11:01:26】 | Trackback:(0) | Comments:(0)
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。