あ、昨日のは違うな。こうでなくてはだめだ。
module A module B module C module D p B # エラー end end end end
トップレベルの定数は別の規則で見えるもんな。
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-mode と i-node は似てる!
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
MAXSYMLINKS ( sys/param.h ) を見ませう ;-)
stat して dev/ino を比べるのでは?
そうしないとハードリンクが扱えないし。
% echo a > a
% ln a b
% cp a b
cp: `a' and `b' are the same file