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
WindowsでMSVCRTとか、Linuxとかだとtelldirは何度呼んでも次にreaddirするまで同じ値を返し続けるんだけど。その感覚からするとtelldirでカウンタが進むのはちょっと驚き。BSD系ってこういうもの? それとも、HFS+の仕様?
manに書いてある通りに使えば問題はない。けれども、manを無視して「どうせオフセット値」とか思って悪いことをすると嵌りそうだ。大昔の、struct direntが実際には配列の要素だったころとは随分違うんだね。
>BSD系ってこういうもの? それとも、HFS+の仕様?
FreeBSDでも同じ挙動だったので、BSD 4.4の仕様な感じ。
Dan the BSD User