ratio - rational - irrational

« 悪夢? | Main | Exception Notifier Pluginを導入して分かったこと »

2007年09月10日

MacOS Xのtelldir/seekdir

MacOS Xのtelldir(3), seekdir(3)の挙動がちょっと面白かった。

今、ls -lするとこうなるディレクトリにいるとしよう。

total 40
drwxr-xr-x   2 yugui  yugui     68  9  7 22:16 1.d/
drwxr-xr-x   2 yugui  yugui     68  9  7 22:16 2.d/
drwxr-xr-x   2 yugui  yugui     68  9  7 22:16 3.d/
drwxr-xr-x   2 yugui  yugui     68  9  7 22:16 4.d/
-rwxr-xr-x   1 yugui  yugui  13484  9 10 21:51 test*
-rw-r--r--   1 yugui  yugui    537  9 10 21:51 test.c

ここで、こんなプログラムを動かしてみる。

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int main(void)
{
    DIR *dp;
    struct dirent *pent;

    dp = opendir(".");
    printf("%ld\n", telldir(dp));
    printf("%ld\n", telldir(dp));
    printf("%ld\n", telldir(dp));
    printf("%ld\n", telldir(dp));
    seekdir(dp, telldir(dp));
    puts("---");
    while ( (pent = readdir(dp)) != NULL )
      {
        printf("%ld: %s\n", telldir(dp), pent->d_name);
        telldir(dp);
        telldir(dp);
        telldir(dp);
        telldir(dp);
        seekdir(dp, telldir(dp)-5);
      }
    return 0;
}

要は無用にtelldirしてるだけ。結果はこうなる。

1
2
3
4
---
6: .
12: ..
18: 1.d
24: 2.d
30: 3.d
36: 4.d
42: test
48: test.c

  • telldirすると毎度ディレクトリストリームのカウンタが進む。
  • 別に最後に呼んだときのカウンタ値以外をseekdirに渡してもOKみたい。

WindowsでMSVCRTとか、Linuxとかだとtelldirは何度呼んでも次にreaddirするまで同じ値を返し続けるんだけど。その感覚からするとtelldirでカウンタが進むのはちょっと驚き。BSD系ってこういうもの? それとも、HFS+の仕様?

manに書いてある通りに使えば問題はない。けれども、manを無視して「どうせオフセット値」とか思って悪いことをすると嵌りそうだ。大昔の、struct direntが実際には配列の要素だったころとは随分違うんだね。



トラックバック

この記事のトラックバックpingのURL:
http://idm.s9.xrea.com/blog/mt-tb.cgi/671

コメント

>BSD系ってこういうもの? それとも、HFS+の仕様?
FreeBSDでも同じ挙動だったので、BSD 4.4の仕様な感じ。
Dan the BSD User

  • Posted by: at 2007年09月10日 23:18

ありがとうございます。 < 弾さん

  • Posted by: Yugui at 2007年09月11日 00:03

新しくコメントをつける

よくわからない理由により、コメントが即座には反映されないかもしれませんか゛、ボタンを押して元の画面に戻ってきたならたぶん正しく送信されています。




blog操作

検索


カテゴリー

このブログについて

あわせて読みたい

follow yugui at http://twitter.com
© 2007 Yugui

Powered by Movable Type 3.2-ja-2