history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-11-18

Rite / 定数参照

あ、昨日のは違うな。こうでなくてはだめだ。

module A
  module B
    module C
      module D
        p B    # エラー
      end
    end
  end
end

トップレベルの定数は別の規則で見えるもんな。

ruby / fileutils

cp a a がエラーにならないぞって言われたので直してチェックインした。 ruby-talk のパッチのように expand_path だけだとシンボリックリンクが はさまったときに同じファイルとわからないことがあったので、 readlink も入れた。

あれ? シンボリックリンクって何段追えばいいんだっけ。 えーと、

~/tmp/symlink % uname -srm
Linux 2.4.22 i686
~/tmp/symlink % echo OK > 0
~/tmp/symlink % prev=0
~/tmp/symlink % for i in {1..64}; do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: 6: Too many levels of symbolic links
cat: 7: Too many levels of symbolic links

うあ、こんなに浅いのか。 すると fileutils の 128 は大きすぎだな。 16 もあれば十分か。

いやその前に Solaris も試そう。

aamine@ultra30 % uname -srm
SunOS 5.9 sun4u
aamine@ultra30 % echo OK > 0
aamine@ultra30 % prev=0
aamine@ultra30 % for i in {1..64};do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: cannot open 21
cat: cannot open 22

Solaris 9 は 20 か。

もしかしてユーザレベルで設定できたりしないだろうな。 とりあえず Linux の /proc にはそれっぽいのはないね。

NetBSD はどうだろう。

aamine@asv800 % uname -srm
NetBSD 1.6.1 alpha
aamine@asv800 % echo OK > 0
aamine@asv800 % prev=0
aamine@asv800 % for i in {1..64}; do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: 33: Too many levels of symbolic links
cat: 34: Too many levels of symbolic links

NetBSD は 32。どんどん上限がのびていくー。

うーむ、それでは Ruby ではいくつくらい追えば十分だろう。 適当に 64 くらいでいい?

いや最後に Cygwin もやってみるか。

~/tmp/symlink % uname -srm
CYGWIN_NT-5.0 1.3.22 (0.78/3/2) i686
~/tmp/symlink % echo OK > 0
~/tmp/symlink % prev=0
~/tmp/symlink % for i in {1..64}; do
for> ln -s $prev $i; prev=$i; cat $i > /dev/null
for> done
cat: 11: Too many symbolic links
cat: 12: Too many symbolic links

Cygwin は 10 と。もしかしてとんでもない値に なってるんじゃないかと思ったが意外と常識的だった。

結論としては 64 ってことで。

シンボリックリンク限界

いや、こんなのがあったんで、 動的に変わる可能性もあるんじゃないでしょうか。

http://www.gnu.org/manual/glibc-2.2.5/html_node/Symbolic-Links.html

int MAXSYMLINKS Macro
 
The macro MAXSYMLINKS specifies how many symlinks some function
will follow before returning ELOOP. Not all functions behave the
same and this value is not the same a that returned for _SC_SYMLOOP
by sysconf. In fact, the sysconf result can indicate that there
is no fixed limit although MAXSYMLINKS exists and has a finite value.

いずれにしても、akr さんのおっしゃるように inode を見るほうがいいみたいですね。 st_ino がポータルなのかどうかでひっかかってたんですが、 Ruby の file.c を見る限り特に限定はないし、 少なくとも Ruby の上においては inode は得られると仮定していいんですね。

そういうわけで、inode を見ることにします。

i

あああ! i-mode と i-node は似てる!

本日のツッコミ(全2件) [ツッコミを入れる]
きしもと (2003-11-18 17:03)

MAXSYMLINKS ( sys/param.h ) を見ませう ;-)

akr (2003-11-18 17:08)

stat して dev/ino を比べるのでは?
そうしないとハードリンクが扱えないし。

% echo a > a
% ln a b
% cp a b
cp: `a' and `b' are the same file

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS