のっけからあれなんですが、正確にいうとファイルの記述子(descriptor)を知ろうです。
printf("STDIN no:%s\n",fileno(STDIN)); printf("STDOUT no:%s\n",fileno(STDOUT)); printf("STDERR no:%s\n",fileno(STDERR)); printf("DATA no:%s\n",fileno(DATA)); open(IN1, "+> ./a"); printf("IN1 no:%s\n",fileno(IN1)); open(IN2, "+>./b"); printf("IN2 no:%s\n",fileno(IN2)); open(IN3, "+>./c"); printf("IN3 no:%s\n",fileno(IN3)); close IN1; open(IN4, "+>./c"); printf("IN4 no:%s\n",fileno(IN4)); open(IN5, "+>./c"); printf("IN5 no:%s\n",fileno(IN5)); __DATA__
STDIN no:0 STDOUT no:1 STDERR no:2 DATA no:3 IN1 no:5 IN2 no:6 IN3 no:9 IN4 no:5 IN5 no:10
- システムは、この数値を見てどこへ読み書きするかを判断しているようです。
- STDINからDATAまでは固定っぽいです。(4番目はなんだろう…。)
- ファイルハンドルをいくつも開き続けていくと記述子の数値は上がっていきます。
- 閉じると、その記述子がまた使えるようになります。
- ハンドルが開けていない場合は、undefになります。
- ファイルハンドルの名前が違っても、記述子が同じだったらそのハンドルは同じです。
if (fileno(THIS) == fileno(THAT)) { #名前違うけれど中身同じ。 print "THIS and THAT are dups\n"; }
まぁ、なんでこんな話をしたかというと。
DATAの記述子を確認すると通常であれば3が返されるんですが、
undefで返ってきていたんですね。
で、なんでかなと調べたので少しまとめてみました。
ちな、undefが返ってきていた理由は、使用していたモジュールがDATAハンドルをcloseしていて使えなくしていたってところです。