世界線航跡蔵

Mad web programmerのYuguiが技術ネタや日々のあれこれをお送りします。

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が実際には配列の要素だったころとは随分違うんだね。

トラックバック

http://yugui.jp/articles/673/ping

現在のところトラックバックはありません

コメント

弾 (2007年09月10日 23時18分43秒)
<p>&gt;BSD系ってこういうもの? それとも、HFS+の仕様?<br />FreeBSDでも同じ挙動だったので、BSD 4.4の仕様な感じ。<br />Dan the BSD User<br /></p>
Yugui (2007年09月11日 00時03分09秒)
<p>ありがとうございます。 &lt; 弾さん<br /></p>
blog comments powered by Disqus

ご案内

前の記事
次の記事

タグ一覧

過去ログ

  1. 2016年07月
  2. 2016年01月
  3. 2015年09月
  4. 2015年08月
  5. 過去ログ一覧

フィード

フィードとは

その他

Powered by "rhianolethe" the blog system